mysql外键约束格式错误

fivyi3re  于 2021-06-17  发布在  Mysql
关注(0)|答案(30)|浏览(511)

我有两张table, table1 是具有列的父表 ID 以及 table2 有一列 IDFromTable1 (不是真实的名字)当我放上一个fk的时候 IDFromTable1IDtable1 我得到了错误 Foreign key constraint is incorrectly formed error . 我想删除表2记录,如果 table1 记录被删除。谢谢你的帮助

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

如果需要其他信息,请告诉我。我是mysql新手

yptwkmov

yptwkmov16#

(last resent)即使字段名和数据类型相同但排序规则不同,也会导致该问题。
例如
    tbl名称       |        数据类型          |         校勘        
    活动ID          |        内景                        |         拉丁语    活动ID          |        内景                        |         utf8\通用\ ci
试着把它改成
    tbl名称       |        数据类型          |         校勘        
    活动ID          |        内景                        |         拉丁语    活动ID          |        内景                        |         拉丁语
....
这对我有用。

apeeds0o

apeeds0o17#

我也有同样的问题,但解决了。
只需确保“table1”中的列“id”具有唯一索引!
当然,这两个表中'id'和'idfromtable1'列的类型、长度必须相同。但你已经知道了。

gpfsuwkq

gpfsuwkq18#

尝试运行以下命令:

show create table Parent

//and check if type for both tables are the same, like myISAM or innoDB, etc
//Other aspects to check with this error message: the columns used as foreign 
keys must be indexed, they must be of the same type 
(if i.e one is of type smallint(5) and the other of type smallint(6), 
it won't work), and, if they are integers, they should be unsigned.

//or check for charsets
show variables like "character_set_database";
show variables like "collation_database";

//edited: try something like this
ALTER TABLE table2
ADD CONSTRAINT fk_IdTable2
FOREIGN KEY (Table1_Id)
REFERENCES Table1(Table1_Id)
ON UPDATE CASCADE 
ON DELETE CASCADE;
js4nwp54

js4nwp5419#

我对laravel5.1迁移模式生成器和mariadb10.1有同样的问题。
问题是我打字了 unigned 而不是 unsigned (the) s 设置列时丢失了字母)。
在修正了排版错误之后,我就修正了。

sg3maiej

sg3maiej20#

检查表引擎,两个表必须是同一个引擎,这对我帮助很大。

ftf50wuq

ftf50wuq21#

这是个老主题,但我发现了一些东西。在构建mysql工作台时,它还获取另一个表的关系。只需留下与你有关的支柱。清除其他自动添加的列。这对我有用。

fxnxkyjh

fxnxkyjh22#

只是为了完成。
如果外键带有varchar(..),并且引用表的字符集与引用它的表的字符集不同,则也可能出现此错误。
e、 g.拉丁1表中的varchar(50)与utf8表中的varchar(50)不同。

pokxtpni

pokxtpni23#

显示此错误的另一个可能原因。我创建表的顺序是错误的。我试图从一个尚未创建的表中引用一个键。

z2acfund

z2acfund24#

我为此输了好几个小时!
一张table上的pk是 utf8 另一方面是 utf8_unicode_ci !

af7jpaap

af7jpaap25#

甚至我在mysql和liquibase上也遇到了同样的问题。这就是问题所在:要从中引用另一个表的列的表在数据类型或数据类型大小方面是不同的。

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.
e.g. :
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.
v8wbuo2f

v8wbuo2f26#

如果一切都好的话,就加上 ->unsigned(); 结束时 foregin key .
如果不起作用,请检查这两个字段的数据类型。它们一定是一样的。

nfs0ujit

nfs0ujit27#

确保列是相同的(类型相同),如果引用列不是 primary_key ,确保是 INDEXED .

ctzwtxfj

ctzwtxfj28#

面对这个问题的人,快跑吧 SHOW ENGINE INNODB STATUS 有关详细信息,请参阅最新的外键错误部分。

dzhpxtsq

dzhpxtsq29#

mysql错误文本没有太大帮助,在我的例子中,列有“notnull”约束,所以“on delete set null”是不允许的

5jdjgkvh

5jdjgkvh30#

我使用的是heidisql,为了解决这个问题,我必须在引用的表中创建一个索引,引用所有列。

相关问题