向现有表添加外键时出现错误1050,表已经存在。

23

我有一个名为CustomizationSet的表,其中包含以下列:

customization_set_guid (which is a non-nullable guid and also the primary key)
creator_account_guid
and a few others

还有一个带有现有数据的表 Registration,包含以下列:

registration_id (an int and the primary key)
customization_set_guid (also a guid (so a char(36)) which is nullable, and all entries are currently null)
and a few other columns

当我尝试运行时

ALTER TABLE Registration ADD FOREIGN KEY 
    (
        customization_set_guid
    ) REFERENCES CustomizationSet (
        customization_set_guid
    );

在MySQL Workbench中,它会显示错误1050Table '.\dbname\registration' already exists.

如果我尝试使用“Alter Table Dialog”的Foreign Keys选项卡来添加外键,并选择CustomizationSet作为参考表,它不允许我在列列表中选择customization_set_guid。

我真的不确定为什么它不允许我添加这个外键。我刚刚成功地在刚刚添加的表之间创建了外键。Registration表已经存在一段时间了...

9个回答

11

我遇到了相同的错误,原因是外键已经存在。你需要做的就是添加约束:

ALTER TABLE Registration 
  ADD CONSTRAINT idx_Registration_CustomizationSet 
  FOREIGN KEY (customization_set_guid) 
  REFERENCES CustomizationSet(customization_set_guid);

2
你不必这样做。我的问题是我尝试添加一个已经存在的约束条件,阅读了一些资料后我意识到这一点。移除约束条件后,MySQL会自动分配一个名称。这来自于http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html: "如果给出了CONSTRAINT符号子句,则符号值必须在数据库中唯一。如果未给出该子句,则InnoDB会自动创建名称。" - Nicsoft
2
这对我实际起到了作用。明确地给出约束的名称是有效的。很奇怪,因为这个表没有任何现有的约束。 - Richard
1
当我为约束指定了一个名称时,它对我起作用了。它一定与另一个现有的约束冲突了。 - Jimbali
1
同样使用phpMyAdmin对我也起作用了,很奇怪,因为所提到的表没有其他约束条件。 - Luca Giorgi
2
如果有人能够解释一下为什么这个有效,我很乐意听听。它解决了问题,但我不知道为什么。 - La masse
这个解决方案对我很有用。不过,如果我不想指定这个问题的约束条件,那么我需要在表中删除所有现有的约束,例如 ALTER TABLE Registration DROP FOREIGN KEY MyConstraintName,然后添加外键 ALTER TABLE Registration ADD FOREIGN KEY... - Arya

2

看起来在MySQL这里有一个关于此问题的错误报告:

MySQL Bug 55296

最终,我猜他们升级了他们的服务器并解决了这个问题。不过从阅读中,我不确定。他们确实有一些解决方法,比如放入约束名/更改它们。如果您认为这是相同的问题,我请求重新打开该错误报告。

有一次,他们提到类型不匹配,并且workbench响应的错误是错误的(应该是errno 150或121)。您可以在此处查看这些错误的原因: MySQL外键错误和errno 150


2

团队成员发现了这个问题。一个表使用的是utf8_general类型,另一个表使用的是默认类型。我并没有认为这是个问题,因为默认类型也是utf8_general,但是显然mysql只关注类型名称而不是底层类型。


1
我遇到了同样的错误,由于我的情况还没有被提及,所以我会发表这个答案,并希望它可以节省某人的时间!
我的两个表引擎是不同的。一个是InnoDB,另一个是MyIsam。
要更改表的引擎:
选择表,点击alter table,然后点击Workbench最右边的那个双箭头(使其指向上方)。
现在更改引擎!

1
  • 检查CustomizationSet表的存储引擎类型。

我曾经遇到同样的问题,但通过将引擎类型更改为InnoDB来解决,因为某些类型不支持外键约束。


0

我不确定这是不是一个打字错误,但应该不会是。

ALTER TABLE Registration ADD FOREIGN KEY 
(
    customization_set_guid
) REFERENCES CustomizationSet (
    customization_set_guid
);

应该是这样的

ALTER TABLE Registration ADD FOREIGN KEY 
customization_set_guid_fk (customization_set_guid) 
REFERENCES CustomizationSet (customization_set_guid);

返回相同的错误。我使用该语法创建的其他表上的其他外键都有效,它只是为键添加了默认名称。 - avaleske
嗯,看起来这似乎与 1050 表'.\dbname\registration' 有关,而不是外键。在另一个表中添加另一个外键是否正常工作? - ace

0

我曾经遇到过类似的问题,最终发现是一个完整性约束的问题。外键列引用了一个不存在的外部列。

尝试运行以下代码来测试是否存在此问题:

select r.customization_set_guid, c.customization_set_guid
from Registration r
right join CustomizationSet c
on 
r.customization_set_guid = c.customization_set_guid
where isnull(c.customization_set_guid);

0

不确定表格是否已经存在,但是它不让你选择想要的列的原因很可能是由于这些列的类型不同。请检查确保它们都是相同的类型、相同的长度,并且具有完全相同的选项。


1
它们都是char(36),但注册表中的一个可以为空。那会有什么影响吗? - avaleske

0
当使用MysqlWorkbench时,错误信息可能会误导人。我的问题是,在一个已有行的表上尝试添加外键约束,并且其中一行为空(不符合FK约束)。MysqlWorkbench并没有报告如果应用约束将失败,而是报告表已存在。
删除有问题的行可以解决这个问题(或者添加可接受值到字段中来满足约束条件)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接