向现有表添加外键会出现错误 1050 表已存在

问题描述 投票:0回答:10

我有一个表格 CustomizationSet,其中包含以下列:

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

还有一个包含现有数据的表格,其中包含以下列:

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 注册已经存在。

如果我尝试使用 UI 通过“更改表”对话框的“外键”选项卡添加外键,并选择 CustomizationSet 作为引用表,它不会让我在列列表中选择customization_set_guid。

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

mysql foreign-keys mysql-workbench mysql-error-1050
10个回答
12
投票

我遇到了同样的错误,这是因为外键已经存在。你想要的只是添加约束:

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

2
投票

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

MySQL 错误 55296

最后,我猜他们升级了服务器并解决了问题。从阅读来看,我不确定。他们确实有一些解决方法,例如输入约束名称/更改它们。如果您认为这是相同的,我会要求重新打开该错误。

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


2
投票

所以一位团队成员想出了这个办法。其中一个表设置为 utf8_general 类型,另一个表设置为默认类型。我不认为这是一个问题,因为默认值是 utf8_general,但显然 mysql 只查看类型名称而不是底层类型。


1
投票

我遇到了同样的错误,由于我的案例尚未提及,我将发布此答案,希望它可以节省某人的时间!

我的两个表引擎不同。 一个是 InnoDB,另一个是 MyIsam。

要更改表的引擎:

选择表格,点击更改表格,然后点击双箭头 工作台的最右侧(因此它将指向上方)。

现在更换引擎!


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

我有同样的问题,但我可以通过将引擎类型更改为来解决它 InnoDB ,因为很少有类型不支持外键约束。


0
投票

不确定表是否已经存在,但它不允许您选择所需列的原因很可能是由于列不是同一类型。检查以确保它们具有相同的类型、相同的长度并且具有相同的选项。


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);

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
投票

使用 MysqlWorkbench 时,该错误具有误导性。我的问题是,我试图在已经有行且其中一行为空的表上添加外键约束(不满足 FK 约束)。MysqlWorkbench 没有抱怨如果应用该约束就会失败,而是报告该表存在。

删除固定的有问题的行(或向字段添加和约束可接受的值)解决了问题。


0
投票

短: 由于以下原因,我遇到了此错误:“外键名称在整个数据库中必须是唯一的”

如果您没有为外键指定名称,自动生成的名称也会遇到同样的问题。

背景: 在我的修复活动中,我发现了这一点,这给了我修复提示: 写入或更新时密钥重复?

在过去,我确实与外键约束作斗争,因此在同一个数据库中有不同的“测试表”。其中一个外键的名称完全相同,因此该名称被阻止。 删除我的测试表解决了这个问题。重命名密钥可能也能做到这一点。

© www.soinside.com 2019 - 2024. All rights reserved.