繁体   English   中英

在非主键之间创建外键关系时出错

[英]Error on creating foreign key relationship between non-primary key

我有两个桌子

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。

您应该将外键与主键建立关系。 我知道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)
);

如果您想要xyz行的ref_id ,则使用JOIN获取信息。

看一下戈登·利诺夫(Gordon Linoff)的答案,他的建议是有道理的,即使它没有回答问题。 那么,当您打算创建foreign key关系时,什么会导致错误? 明显的可能是语法错误和拼写错误,因此您将需要检查并纠正所有此类问题。

另一种可能性是您有不一致之处,即您尝试在一个table创建foreign key约束,但并非所有值都具有完全匹配的值。 因此,假设您具有FooBar表,并且打算将Foo.lorem引用Bar.ipsumforeign key ,那么您需要确保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);

仔细阅读这些行,并确保您修复了任何此类Foo.lorem值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM