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

时间:2019-03-22 11:55:26

标签: mysql sql database foreign-keys

我有两个桌子

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。

2 个答案:

答案 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约束,但并非所有值都具有完全匹配的值。因此,假设您有FooBar表,并且您打算将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); 值。