错误代码3780 外键约束中的引用和引用列不兼容

问题描述 投票:0回答:4

我希望表

personOne
中的
b
列引用表
person
上的
a
列。

create table a(
person varchar(20),
cost varchar(10) not Null
)character set latin1
collate latin1_general_ci;

create table b(
personOne varchar(20),
personTwo varChar(2) not null,
key person_index (personOne),
CONSTRAINT C FOREIGN KEY (personOne) references a(person)
) engine=InnoDB default charset=latin1;

错误代码:3780。引用列“personOne”与外键约束“C”中引用的列“person”不兼容。

我尝试将表引擎设置为 InnoDB,但这不起作用。

mysql sql foreign-keys
4个回答
13
投票

两列必须具有相同的排序规则。我猜你的表

b
正在使用旧版本MySQL的默认排序规则,即
latin1_swedish_ci

您可能想查看此外键清单:https://stackoverflow.com/a/4673775/20860

我建议最好的选择是声明

a
b
表,其中包含字符集
utf8mb4
和排序规则
utf8mb4_unicode_520_ci
(如果您的 MySQL 版本足够新以支持它)。


3
投票

我得到了相同的错误代码。 虽然这可能对你的情况没有帮助,但我的问题是;

我所有表中的 ID 列都设置为

INT UNSIGNED
,但我使用的是 INT 类型签名的
外键


1
投票

这里我必须首先在

a
中定义一个主键:

ALTER TABLE a ADD PRIMARY KEY (person);

并传递

COLLATE
a
值:

CREATE TABLE b (
...
)ENGINE=InnoDB 
    DEFAULT CHARSET=latin1 
    COLLATE latin1_general_ci;

0
投票

请检查您的数据类型,即外键约束中的引用列和被引用列。例如。请检查这两个数据类型是否为 varchar、不是 null 或任何其他相同的数据类型,如果它们的数据类型不同,则会显示此错误

© www.soinside.com 2019 - 2024. All rights reserved.