MySQL foreign key的几个注意点

本文介绍MySQL5.6版本中外键约束的创建方法及其限制条件,包括正确的语法使用及MyISAM表在外键方面的局限性。

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

1 mysql5.6.24 innodb中若直接在定义列的时候加上references parentTable(col)并不能创建外键,需要单独的foreign key句子。

例子:

create table t1(id int primary key)engine=innodb;
create table t2(id int references t1(id) ON DELETE CASCADE ON UPDATE CASCADE)engine=innodb;no
create table t3(id int unique references t1(id) ON DELETE CASCADE ON UPDATE CASCADE)engine=innodb;no
create table t4(id int primary key references t1(id) ON DELETE CASCADE ON UPDATE CASCADE)engine=innodb;no
create table t5(id int,foreign key(id) references t1(id) ON DELETE CASCADE ON UPDATE CASCADE)engine=innodb;ok

2 被参照的列(簇)需要是某个索引的第一个列(簇)

例子:

create table t1(id1 int,id2 int,id3 int,primary key(id1,id2,id3),index(id3,id2))engine=innodb;
create table t2(id1 int,foreign key(id1) references t1(id1))engine=innodb;ok
create table t3(id3 int,foreign key(id3) references t1(id3))engine=innodb;ok
create table t4(id2 int,foreign key(id2) references t1(id2))engine=innodb;can't add foreign key

官方文档:

      MySQL requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. 

3 myisam表不能创建外键

例子:

create table t1(id int primary key)engine=myisam;

create table t2(id int,foreign key(id) references t1(id))engine=myisam; no foreign key

在mysql5.6.24和mysql5.1.73中测试都是这样。

<think>好的,我现在需要帮助用户解决在MySQL 8.0中添加外键关联的问题。首先,我应该回顾用户提供的引用内容,确保答案准确。用户提到了四个引用,涉及外键语法、错误处理、InnoDB引擎支持以及两种创建方式。 首先,外键约束需要满足几个条件:使用InnoDB引擎,字段类型长度必须匹配,索引的存在等。用户可能遇到的常见问题比如Error 1215,应该解释如何避免。 接下来,我需要分步骤说明创建外键的方法。根据引用[3][4],有两种方式:建表时添加后期修改。需要给出具体的SQL示例,比如CREATE TABLEALTER 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、付费专栏及课程。

余额充值