【问题标题】:Error on creating foreign key relationship between non-primary key在非主键之间创建外键关系时出错
【发布时间】:2019-03-22 11:55:25
【问题描述】:

我有两张桌子

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。

【问题讨论】:

  • 您尝试创建 FK 时的语法是什么?
  • @Cid 我已纠正;我一直认为他们必须是完全匹配的。谢谢你。

标签: mysql sql database foreign-keys


【解决方案1】:

您应该与主键建立外键关系。我知道 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 获取信息。

【讨论】:

  • 我不是反对者,但这个答案没有回答问题。它应该是一条评论,因为您正在(以合理的方式)批评 op 编写代码的方式。要回答这个问题,您需要解释在尝试创建外键时会导致错误的原因。提示:表已经存在。
【解决方案2】:

看看 Gordon Linoff 的回答,他的建议是有道理的,即使它没有回答问题。那么当您打算创建foreign key 关系时,什么会导致错误呢?明显的可能性是语法错误和拼写错误,因此您需要检查这些并修复任何此类问题。

另一种可能是您存在不一致,即您尝试在其中一个tables 中创建foreign key 约束,但并非所有值都完全匹配。因此,假设您有Foo 和Bar 表并且您打算将Foo.lorem 用作引用foreign key 的Bar.ipsum,那么您将需要确保您拥有的Foo.lorem 的所有值都有一个@ 987654330@ 与完全相同的值配对(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 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2015-03-25
    相关资源
    最近更新 更多