我有两个桌子
CREATE TABLE `abc` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ref_id` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ref_id_UNIQUE` (`ref_id`)
)
CREATE TABLE `xyz` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ref_id` varchar(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ref_id_UNIQUE` (`ref_id`)
)
我想在xyz的ref_id和abc的ref_id之间建立外键关系,但是Mysql给出错误1215。
答案 0 :(得分:3)
您应将外键与主键建立关系。我知道MySQL允许带有索引的任何东西都具有外键关系。但是正确的做法是使用主键。
因此声明表如下:
CREATE TABLE `xyz` (
`id` int(11) NOT NULL AUTO_INCREMENT,
abc_id int DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ref_id_UNIQUE` (`abc_id`),
ADD CONSTRAINT fk_xyz_abc FOREIGN KEY (abc_id) REFERENCES abc(id)
);
如果您希望ref_id
用于xyz
行,请使用JOIN
来获取信息。
答案 1 :(得分:0)
看看戈登·利诺夫(Gordon Linoff)的答案,他的建议是有道理的,即使它没有回答问题。那么当您打算创建foreign key
关系时,什么会导致错误呢?明显的可能是语法错误和拼写错误,因此您将需要检查并纠正所有此类问题。
另一种可能性是您有不一致之处,即您尝试在foreign key
之一中创建table
约束,但并非所有值都具有完全匹配的值。因此,假设您有Foo
和Bar
表,并且您打算将Foo.lorem
用作引用foreign key
的{{1}},那么您将需要确保所有您为Bar.ipsum
获得的值具有一对Foo.lorem
,它们具有完全相同的值(Bar.ipsum
除外)。如果不正确,那么您的null
约束将不会成功创建。找到这样的不一致之处:
foreign key
仔细阅读这些行,并确保您修复了任何这样的select distinct Foo.lorem
from Foo
where not (Foo.lorem is null) and
not exists (select 1 from Bar where Foo.lorem = Bar.ipsum);
值。