mysql外键约束错误地形成了错误

我有两个表, table1是父列表与列IDtable2IDFromTable1 (而不是实际名称)当我把FK IDFromTable1 IDtable1我得到错误Foreign key constraint is incorrectly formed error 。 我想删除表2logging如果table1logging被删除。 感谢您的帮助

 ALTER TABLE `table2` ADD CONSTRAINT `FK1` FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`) ON UPDATE CASCADE ON DELETE CASCADE; 

让我知道是否需要其他信息。 我是新来的MySQL

我遇到了与HeidiSQL相同的问题。 你收到的错误是非常神秘的。 我的问题最终是外键列和引用列不是相同的types或长度。

外键列是SMALLINT(5) UNSIGNED ,引用列是INT(10) UNSIGNED 。 一旦我把它们做成同一种types,那么外键的创build就完美了。

当使用MyISAM引擎创build父表时,我遇到了同样的问题。 这是一个愚蠢的错误,我固定:

 ALTER TABLE parent_table ENGINE=InnoDB; 

用于定义外键的语法是非常宽容的,但是对于其他人而言,外键必须是“相同types”的事实甚至适用于整理,而不仅仅是数据types和长度以及位签名。

不是说你会在你的模型中混用sorting规则(对吗?),但是如果你这样做的话,要确保你的主键字段和外键字段在phpmyadmin或Heidi SQL中使用相同的sortingtypes。

希望这可以为您节省四个小时的试验和错误。

确保列是相同的(相同types),如果引用列不是primary_key ,确保它是INDEXED

只是为了完成。

如果你有一个带有VARCHAR(..)的外键,被引用表的字符集与引用它的表不同,那么这个错误可能也是如此。

例如Latin1表中的VARCHAR(50)与UTF8表中的VARCHAR(50)不同。

MySQL的错误文本没有太大的帮助,在我的情况下,该列有“非空”约束,所以“on delete set null”是不允许的

我有同样的问题,但解决了。

只要确保'table1'中的'ID'列具有唯一索引!

当然,这两个表中的types,列ID和IDFromTable1的长度必须相同。 但是你已经知道这个了。

您需要检查两者的所有属性相同,包括“整理”

尝试运行以下:

显示创build表父

 //检查两个表的types是否相同,如myISAM或innoDB等
 //检查此错误消息的其他方面:用作外部的列 
键必须被索引,它们必须是相同的types 
 (如果一个是smallinttypes(5),另一个是smallinttypes(6), 
它将不起作用),如果它们是整数,则它们应该是无符号的。

 //或检查字符集
显示“character_set_database”这样的variables;
显示像“collat​​ion_database”的variables;

 //编辑:尝试这样的事情
 ALTER TABLE table2
 ADD CONSTRAINT fk_IdTable2
外键(Table1_Id)
参考Table1(Table1_Id)
在更新级联 
 ON DELETE CASCADE;

我和Symfony 2.8有同样的问题。

起初我没有弄明白,因为在外键的整数长度方面没有类似的问题。

最后,我不得不在项目文件夹中执行以下操作。 (服务器重启没有帮助!)

app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result

谢谢S Doerin:

“只是为了完成,如果你有一个带有VARCHAR(..)的外键,并且被引用表的字符集与引用它的表不同,那么这个错误也可能是这样的,例如VARCHAR(50)不同于UTF8表中的VARCHAR(50)“。

我解决了这个问题,改变了表格的字符types。 创build有latin1,正确的是utf8。

添加下一行。 DEFAULT CHARACTER SET = utf8;

我有问题使用Alter表添加一个外键之间的两个表和帮助我的东西是确保每一列,我试图添加一个外键关系索引。 要在PHP myAdmin中执行此操作:转到表格并单击结构选项卡。 单击索引选项来索引所需的列,如屏幕截图所示:

在这里输入图像描述

一旦我索引两列我试图引用我的外键,我能够成功地使用alter table并创build外键关系。 您将会看到列的索引如下图所示:

在这里输入图像描述

请注意zip_code如何在两个表中显示。

我也有同样的问题。

问题是参考列不是主键。

把它作为主键,问题就解决了。

与Laravel 5.1迁移架构生成器与MariaDB 10.1我有同样的问题。

问题是我在设置列时input了unsigned而不是unsigned (字母不存在)。

修好之后,我错误地修正了错字错误。

如果一切正常,只需添加->unsigned(); foregin key的末尾。

如果不起作用,请检查两个字段的数据types。 他们必须是一样的。

虽然其他答案是相当有帮助的,但也想分享我的经验。

我遇到了这个问题,当我已经删除了一个表的id已被引用为其他表中的外键( 与数据 ),并试图重新创build/导入表的一些额外的列。

重新查询(在phpMyAdmin中生成)如下所示:

 CREATE TABLE `the_table` ( `id` int(11) NOT NULL, /* No PRIMARY KEY index */ `name` varchar(255) NOT NULL, `name_fa` varchar(255) NOT NULL, `name_pa` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ... /* SOME DATA DUMP OPERATION */ ALTER TABLE `the_table` ADD PRIMARY KEY (`id`), /* PRIMARY KEY INDEX */ ADD UNIQUE KEY `uk_acu_donor_name` (`name`); 

您可能会注意到, PRIMARY KEY索引是在创build( 和插入数据 )之后设置的,这是导致问题的原因。

解决的办法是在被引用为外键的id表定义查询中添加PRIMARY KEY索引,同时将其从设置索引的ALTER TABLE部分中删除:

 CREATE TABLE `the_table` ( `id` int(11) NOT NULL PRIMARY KEY, /* <<== PRIMARY KEY INDEX ON CREATION */ `name` varchar(255) NOT NULL, `name_fa` varchar(255) NOT NULL, `name_pa` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

检查表引擎,这两个表必须是相同的引擎,这帮助了我很多。

我使用的是HeidiSQL ,为了解决这个问题,我不得不在引用表中创build一个索引,并引用所有的列。

将表添加到Heidisql表

即使我遇到与MySQL和liquibase相同的问题。 所以这就是问题所在:从数据types的数据types或数据types的大小来看,您想要引用其他表的列的表是不同的。

 Error appears in below scenario: Scenario 1: Table A has column id, type=bigint Table B column referenced_id type varchar(this column gets the value from the id column of Table A.) Liquibase changeset for table B: <changeset id="XXXXXXXXXXX-1" author="xyz"> <column name="referenced_id" **type="varchar"**> </column> </changeset> <changeSet id="XXXXXXXXXXX-2" author="xyz"> <addForeignKeyConstraint constraintName="FK_table_A" referencedTableName="A" **baseColumnNames="referenced_id**" referencedColumnNames="id" baseTableName="B" /> </changeSet> Table A changeSet: <changeSet id="YYYYYYYYYY" author="xyz"> <column **name="id"** **type="bigint"** autoIncrement="${autoIncrement}"> <constraints primaryKey="true" nullable="false"/> </column> </changeSet> Solution: correct the type of table B to bigint because the referenced table has type bigint. Scenrario 2: The type might be correct but the size might not. eg : Table B : referenced column type="varchar 50" Table A : base column type ="varchar 255" Solution change the size of referenced column to that of base table's column size. 
Interesting Posts