SQL无法添加外键限制

8 浏览
0 Comments

SQL无法添加外键限制

我正在试图将我的新架构转移到数据库服务器上,但我无法弄清楚为什么会出现这个错误。我已经尝试在这里搜索答案,但我找到的所有内容都说要么将数据库引擎设置为InnoDB,要么确保我尝试用作外键的键是它们自己表中的主键。如果我没有弄错的话,我已经做了这两件事。我还能做什么?

执行服务器上的SQL脚本

错误:错误1215:无法添加外键约束

- ------------------------------------------------- ------

- 表`Alternative_Pathways`。`Clients_has_Staff`

- ------------------------------------------------- ------

CREATE TABLE IF NOT EXISTS`Alternative_Pathways`。`Clients_has_Staff`(

`Clients_Case_Number` INT NOT NULL,

`Staff_Emp_ID` INT NOT NULL,

PRIMARY KEY(`Clients_Case_Number`,`Staff_Emp_ID`),

索引`fk_Clients_has_Staff_Staff1_idx`(`Staff_Emp_ID` ASC),

索引`fk_Clients_has_Staff_Clients_idx`(`Clients_Case_Number` ASC),

约束`fk_Clients_has_Staff_Clients`

外键(`Clients_Case_Number`)

参考`Alternative_Pathways`。`Clients`(`Case_Number`)

删除NO ACTION

更新NO ACTION,

约束`fk_Clients_has_Staff_Staff1`

外键(`Staff_Emp_ID`)

参考`Alternative_Pathways`。`Staff`(`Emp_ID`)

删除NO ACTION

更新NO ACTION)

引擎=InnoDB

SQL脚本执行完成:语句:7成功,1失败

这是父表的SQL。

CREATE TABLE IF NOT EXISTS`Alternative_Pathways`。`Clients`(

`Case_Number` INT NOT NULL,

`First_Name` CHAR(10)NULL,

`Middle_Name` CHAR(10)NULL,

`Last_Name` CHAR(10)NULL,

`Address` CHAR(50)NULL,

`Phone_Number` INT(10)NULL,

PRIMARY KEY(`Case_Number`))

引擎=InnoDB

CREATE TABLE IF NOT EXISTS`Alternative_Pathways`。`Staff`(

`Emp_ID` INT NOT NULL,

`First_Name` CHAR(10)NULL,

`Middle_Name` CHAR(10)NULL,

`Last_Name` CHAR(10)NULL,

PRIMARY KEY(`Emp_ID`))

引擎=InnoDB

0
0 Comments

问题:SQL无法添加外键约束

出现原因:

1. 没有在所有表上使用InnoDB作为引擎。

2. 在目标表上尝试引用不存在的键。确保它是另一张表上的键(可以是主键、唯一键,或者只是一个普通键)。

3. 列的类型不同(一个例外是参考表上的列可以是可空的,即使在被引用的表上不可为空)。

4. 如果主键或外键是varchar类型,请确保两者的排序规则相同。

5. 另一个原因可能是用于ON DELETE SET NULL的列没有定义为null。因此,请确保该列设置为默认为null。

解决方法:

检查这些原因。

如果外键是字符列,则字符集和排序规则必须相同。可以从这里开始调试错误1215的解决方法。

还可以从这里添加一些更微妙的情况,以防您的错误不是由这些原因造成的。

我遇到的原因是你提到的第一个原因"两个表的不同数据库引擎,一个是InnoDB,一个是MyISAM"。

我还遇到了另一个原因 =)

ON DELETE CASCADE ON UPDATE SET NULL:

您定义了SET NULL的条件,但某些列被定义为NOT NULL。因此,只需修复外键定义即可。

还可能的失败原因是目标字段上的索引不存在

与第三条相关:如果您有一个组合主键,并且您没有引用主键的所有部分,也可能发生错误。

原因#5...外键表是否已创建?这就是我的原因 🙂

MySQL文档详细描述了所有InnoDB外键约束:dev.mysql.com/doc/refman/5.7/en/…

更新为InnoDB后问题得到解决。

实际上,我遇到的问题是提到的问题,将架构排序规则从utf8转换为utf8mb4,但没有转换现有的表,因此无法将新表的外键添加到旧表,因为它们使用了不同的排序规则。这个问题花费了很长时间才找到。如果您能将"表之间的不同排序规则"添加为其中一个原因,那将非常好。

上述答案中添加另一个原因:> 7-在使用多列键时,外键的创建顺序必须与表列顺序匹配。

完全正确,对我来说是第四种情况,使用不同编码的Varchar键。

对我来说是不同的字符集,一个表是latin1,另一个表是utf8

0