mysql外键约束错误地形成了错误
我有两个表, table1
是父列表与列ID
和table2
列IDFromTable1
(而不是实际名称)当我把FK IDFromTable1
ID
到table1
我得到错误Foreign key constraint is incorrectly formed error
。 我想删除表2logging如果table1
logging被删除。 感谢您的帮助
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; 显示像“collation_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一个索引,并引用所有的列。
即使我遇到与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.