mysql中的外键foreign key

本文详细介绍了外键的概念、作用及三种约束模式,并提供了在MySQL中创建、修改和删除外键的具体方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、如果一张表中有一个非主键的字段指向了别一张表中的主键,就将该字段叫做外键。

  一张表中可以有多个外键。

  外键的默认作用有两点:

  1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败。

  2.对父表的作用:对父表的主键字段进行删和改时,如果对应的主键在子表中被引用,操作就会失败。

  外键的定制作用----三种约束模式:

    district:严格模式(默认), 父表不能删除或更新一个被子表引用的记录。

    cascade:级联模式, 父表操作后,子表关联的数据也跟着一起操作。

    set null:置空模式,前提外键字段允许为NLL,  父表操作后,子表对应的字段被置空。

  使用外键的前提:

  1. 表储存引擎必须是innodb,否则创建的外键无约束效果。

  2. 外键的列类型必须与父表的主键类型完全一致。

  3. 外键的名字不能重复。

  4. 已经存在数据的字段被设为外键时,必须保证字段中的数据与父表的主键数据对应起来。

二、新增外键

  1. 在创建时增加

   create table my_tab1(

   id int primary key auto_increment,

   name varchar(10) not null,

   class int,

   foreign key(class) references my_tab2(主键字段名);

   )charset utf8;

  2. 在创建好的表中增加

   alter table my_tab1 add [constraint 外键名] foreign key(外键字段名) references mytab2(主键字段名);

三、删除外键

  alter table my_tab drop foreign key 外键名字;

转载于:https://www.cnblogs.com/pengyin/p/6375860.html

<think>好的,我现在需要帮助用户解决在MySQL 8.0中添加关联的问题。首先,我应该回顾用户提供的引用内容,确保答案准确。用户提到了四个引用,涉及语法、错误处理、InnoDB引擎支持以及两种创建方式。 首先,约束需要满足几个条件:使用InnoDB引擎,字段类型和长度必须匹配,索引的存在等。用户可能遇到的常见问题比如Error 1215,应该解释如何避免。 接下来,我需要分步骤说明创建的方法。根据引用[3]和[4],有两种方式:建表时添加和后期修改。需要给出具体的SQL示例,比如CREATE TABLE和ALTER TABLE的语法,同时注意CONSTRAINT的可选性。 还要提到的更新和删除行为,比如CASCADE、SET NULL等,这在引用[4]中有涉及。此,注意事项部分应该涵盖引擎类型、字段匹配、索引和命名约束,这些在引用[1]、[2]和[4]中都有提到。 用户可能对错误1215的原因感兴趣,需要解释可能的原因,比如引擎不对或者字段不匹配。同时,提醒他们使用SHOW ENGINE INNODB STATUS来查看详细错误信息,这来自引用[1]。 最后,生成相关问题,覆盖的作用、错误处理、不同引擎支持、行为参数以及性能影响,这样用户可以有进一步的学习方向。 需要确保回答结构清晰,步骤明确,语法正确,并且引用正确标注。避免使用Markdown,用自然的中文分步骤解释,同时保持口语化。</think>在 MySQL 8.0 中创建约束需要遵循以下步骤: ### 一、创建的条件 1. 必须使用 `InnoDB` 存储引擎(可通过 `ENGINE=InnoDB` 指定)[^2] 2. 关联字段的数据类型和长度必须完全一致 3. 父表的被引用字段必须建立索引(主或唯一索引) ### 二、创建的两种方式 #### 方式1:建表时创建 ```sql CREATE TABLE 子表 ( 子表_id INT PRIMARY KEY, 父表_id INT, -- 定义语法: FOREIGN KEY (父表_id) REFERENCES 父表(父表主字段) ON DELETE CASCADE -- 级联删除 ON UPDATE RESTRICT -- 禁止更新 ) ENGINE=InnoDB; ``` #### 方式2:后期添加(推荐) ```sql ALTER TABLE 子表 ADD CONSTRAINT fk_自定义约束名 -- CONSTRAINT可选[^4] FOREIGN KEY (字段) REFERENCES 父表(主字段) [ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION}] [ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION}]; ``` ### 三、行为参数说明 | 参数 | 功能说明 | |------------|------------------------------| | CASCADE | 级联操作(删除/更新父表记录时同步子表)| | SET NULL | 将子表字段设为NULL | | RESTRICT | 默认值,禁止对父表进行相关操作| | NO ACTION | 与RESTRICT等效 | ### 四、注意事项 1. 出现 Error 1215 的常见原因: - 表未使用 InnoDB 引擎 - 字段类型/长度不匹配(如 INT 与 BIGINT) - 缺少父表对应字段的索引[^1] 2. 可通过 `SHOW ENGINE INNODB STATUS` 查看详细错误信息 3. 建议显式命名约束(`CONSTRAINT fk_name`)便于后续管理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值