MySQL Error 1215: Cannot add foreign key constraint
我正在尝试将我的新架构转发到我的数据库服务器上,但我无法弄清楚为什么我收到此错误。 我试图在这里搜索答案,但我发现的所有内容都说要么将数据库引擎设置为Innodb,要么确保我尝试用作外键的密钥是他们自己的表中的主键。 如果我没弄错的话,我已经完成了这两件事。 你们可以提供的任何其他帮助?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | Executing SQL script in server ERROR: Error 1215: Cannot add foreign key constraint -- ----------------------------------------------------- -- Table `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`) , INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) , INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) , CONSTRAINT `fk_Clients_has_Staff_Clients` FOREIGN KEY (`Clients_Case_Number` ) REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `fk_Clients_has_Staff_Staff1` FOREIGN KEY (`Staff_Emp_ID` ) REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB |
SQL脚本执行完成:语句:7成功,1失败
这是父表的SQL。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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`) ) ENGINE = 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`) ) ENGINE = InnoDB |
我猜测
也许父表中的列是
它们需要在两个表中具有完全相同的数据类型。
您可能会收到外键约束错误的原因:
更新:
检查这些。
对于其他人,同样的错误可能并不总是由于列类型不匹配,您可以通过发出命令找到有关mysql foriegn键错误的更多信息
您可能会在打印消息的顶部附近发现错误
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
错误1215是令人讨厌的。 Explosion Pill的答案涵盖了基础知识。你想确保从那里开始。但是,还有更多,更微妙的案例需要注意:
例如,当您尝试链接不同表的PRIMARY KEY时,请确保提供正确的
1 2 3 4 |
不会飞,因为PRIMARY KEYs(例如
我确信,在添加这些约束时,还有更多类似的微妙问题,这就是为什么遇到约束错误时,总是要确保约束及其含义在您当前的上下文中有意义。祝你的错误1215好运!
检查表的排序规则,使用
两个表都必须具有相同的排序规则。
它发生在我身上。
在我的情况下,我删除了一个表使用
在使用Laravel 4时,我遇到了"错误1215:无法添加外键约束"的缺陷,特别是与JeffreyWay的Laravel 4 Generators。
在Laravel 4中,您可以使用JeffreyWay的Generators生成迁移文件以逐个创建表,这意味着每个迁移文件生成一个表。
您必须知道每个迁移文件都是使用文件名中的时间戳生成的,这会为文件提供订单。当您触发Artisan CLI命令"php artisan migrate"时,生成顺序也是迁移操作的顺序。
因此,如果文件要求引用将在后一个文件中生成但尚未生成的密钥的外键约束,则会触发错误1215。
在这种情况下,您需要做的是调整迁移文件生成的顺序。以正确的顺序生成新文件,复制内容,然后删除无序的旧文件。
我在尝试添加fk时遇到了同样的错误。在我的情况下,问题是由FK表的PK标记为无符号引起的。
我有同样的问题。
我解决了这个问题:
我在中创建了以下行
<5233>
尝试在我的架构构建器中导入表后,我发现了这个解决方案。如果它适合您,请告诉我!
祝好运!
FelipeTércio
我有同样的问题,我的解决方案:
之前:
1 2 3 4 5 6 7 8 | CREATE TABLE EMPRES ( NoFilm smallint NOT NULL PRIMARY KEY (NoFilm) FOREIGN KEY (NoFilm) REFERENCES cassettes ); |
解:
1 2 3 4 5 6 |
我希望它有所帮助;)
我找不到这个错误
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | CREATE TABLE RATING ( Riv_Id INT(5), Mov_Id INT(10) DEFAULT 0, Stars INT(5), Rating_date DATE, PRIMARY KEY (Riv_Id, Mov_Id), FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID) ON DELETE SET NULL ON UPDATE CASCADE, FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID) ON DELETE SET DEFAULT ON UPDATE CASCADE ) |
对于MySQL(INNODB)...获取要链接的列的定义
1 2 3 |
比较并验证两个列定义都有
same COLUMN_TYPE(length), same COLATION
可能会有所帮助
1 2 3 | set foreign_key_checks=0; ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ... set foreign_key_checks=1; |
另一个原因:如果使用
根据我的理解,它不会成为数据完整性的问题,但似乎MySQL不支持此功能(在5.7中)。
当列的类型不相同时,也会发生这种情况。
例如如果您引用的列是UNSIGNED INT并且引用的列是INT,则会出现此错误。
检查表兼容性。例如,如果一个表是
当发生此错误时,因为引用的表使用MyISAM引擎,此答案提供了一种快速转换数据库的方法,因此所有Django模型表都使用InnoDB:https://stackoverflow.com/a/15389961/2950621
这是一个名为convert_to_innodb的Django管理命令。
喔我刚拿到它!这是很多已发布的答案(innoDB,unsigned等)的混合。我在这里没有看到的一件事是:如果您的FK指向PK,请确保源列具有合理的值。例如,如果PK是mediumint(8),请确保源列还包含mediumint(8)。这对我来说是问题的一部分。
对我来说,这是列类型。 BigINT!= INT。
但后来它仍然没有奏效。
所以我检查了引擎。确保Table1 = InnoDB和Table = InnoDB
我出于完全不同的原因遇到了这个错误。我使用MySQL Workbench 6.3创建了我的数据模型(很棒的工具)。我注意到,当外键约束定义中定义的列顺序不适合表列序列时,也会生成此错误。
我花了大约4个小时尝试其他所有东西,但检查了一下。
现在一切都运转良好,我可以回到编码。 :-)
我只想添加这个案例以及
简答:
架构,表,列,引用表,引用列以及引用父表的任何其他表的字符集和排序规则必须匹配。
答案很长:
我的表中有一个ENUM数据类型。我将其更改为
在使用此命令时,我得到了以下详细的错误描述,没有其他有用的信息
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
Please refer to http://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html for correct foreign key definition.
之后我使用了Arvind Bharadwaj建议的
这给出了以下错误消息:
Error Code: 1822. Failed to add the foreign key constraint. Missing
index for constraint
在这一点上,我'反向工程'了架构,我能够在EER图中建立外键关系。在"前瞻性工程师"中,我收到以下错误:
Error 1452: Cannot add or update a child row: a foreign key constraint
fails
当我将EER图转发到新模式时,SQL脚本运行没有问题。在比较生成的SQL和转发工程师的尝试时,我发现差异是字符集和整理。父表,子表和两列具有
对于整个模式,我将所有表和所有列的字符集和排序规则更改为以下内容:
这最终解决了1215错误的问题。
边注:
collat??ion
在@Explosion Pills上添加另一个原因回答如上:
7- When using multi column keys, the order in the foreign key creation
must match the other in the table column order.
此错误的另一个来源是您有两个或多个具有相同外键名称的相同表名。这有时会发生在使用建模和设计软件的人身上,例如Mysql Workbench,然后从设计中生成脚本。
当使用laravel迁移时尝试创建外键时
像这样的例子:
用户表
1 2 3 4 5 6 7 8 9 10 |
颜色表
1 2 3 4 5 6 7 8 |
有时属性不起作用
1 2 |
发生此错误是因为[用户表]中的外键(类型)与[颜色表]中的主键(类型)不同
要解决此问题,应更改[颜色表]中的主键
使用主键
你应该使用
1 2 |
使用主键
你应该使用
1 2 | $table-> unsignedTinyInteger('fk_id'); $table->foreign('fk_id')->references('id')->on('table_name'); |
使用主键
你应该使用
1 2 | $table-> unsignedSmallInteger('fk_id'); $table->foreign('fk_id')->references('id')->on('table_name'); |
使用主键
你应该使用
1 2 | $table-> unsignedMediumInteger('fk_id'); $table->foreign('fk_id')->references('id')->on('table_name'); |
我知道我参加派对的时间非常晚,但我想把它放在这里,以便列出来。
除了确保字段具有相同定义的所有上述建议,并且表类型也具有相同的排序规则,请确保您没有尝试链接CHILD字段中的数据不是字段的新手错误已经在PARENT字段中。如果您在CHILD字段中的数据尚未输入PARENT字段,则会导致此错误。遗憾的是错误消息没有多大帮助。
如果您不确定,请备份具有外键的表,删除所有数据,然后尝试创建外键。如果成功那么你该做什么!
祝好运。
这是已经说过的一个微妙的版本,但在我的实例中,我有2个数据库(foo和bar)。我首先创建了foo,但我没有意识到它在bar.baz中引用了一个外键(它还没有创建)。当我尝试创建bar.baz(没有任何外键)时,我不断收到此错误。环顾四周后,我在foo中找到了外键。
所以,长话短说,如果你收到这个错误,你可能有一个预先存在的外键创建表。
在我的情况下,由于源表不存在,我不得不禁用
对我来说,当我导入由
由于mysqldump按字母顺序排序表并且我不想更改表的名称,因此我按照JeremyWeir在此页面上的答案中的说明进行操作,该页面指出将
那个解决方案对我有用。
请注意反引号的使用。我在脚本中有以下声明
1 |
但最后的反引号是错误的。应该是:
1 |
MySQL不幸没有关于此错误的详细信息......
即使我有同样的问题。错误在于FK表PK中的"无符号"标记
我曾经遇到过同样的错误。我只是简单地重新启动MySQL服务器并修复了问题。