我有一个表格 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。
我真的不确定为什么它不允许我添加这个外键。我刚刚在刚刚添加的表之间成功创建了外键。登记表已经存在一段时间了...
我遇到了同样的错误,这是因为外键已经存在。你想要的只是添加约束:
ALTER TABLE Registration
ADD CONSTRAINT idx_Registration_CustomizationSet
FOREIGN KEY (customization_set_guid)
REFERENCES CustomizationSet(customization_set_guid);
看起来 MySQL 上有一个关于此问题的错误报告:
最后,我猜他们升级了服务器并解决了问题。从阅读来看,我不确定。他们确实有一些解决方法,例如输入约束名称/更改它们。如果您认为这是相同的,我会要求重新打开该错误。
有一次,他们提到类型不匹配,工作台响应错误错误(应该是 errno 150 或 errno 121)。您可以在此处查看这些错误的原因: MySQL 外键错误和 Errno 150
所以一位团队成员想出了这个办法。其中一个表设置为 utf8_general 类型,另一个表设置为默认类型。我不认为这是一个问题,因为默认值是 utf8_general,但显然 mysql 只查看类型名称而不是底层类型。
我遇到了同样的错误,由于我的案例尚未提及,我将发布此答案,希望它可以节省某人的时间!
我的两个表引擎不同。 一个是 InnoDB,另一个是 MyIsam。
要更改表的引擎:
选择表格,点击更改表格,然后点击双箭头 工作台的最右侧(因此它将指向上方)。
现在更换引擎!
- 检查 CustomizationSet 表的存储引擎类型。
我有同样的问题,但我可以通过将引擎类型更改为来解决它 InnoDB ,因为很少有类型不支持外键约束。
不确定表是否已经存在,但它不允许您选择所需列的原因很可能是由于列不是同一类型。检查以确保它们具有相同的类型、相同的长度并且具有相同的选项。
我不确定这是否是一个错字,但不应该是
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);
我也遇到过类似的问题,最后是完整性约束的问题。 外键列引用了一个没有引用的外键列 存在。
尝试运行以下命令来测试是否是这种情况:
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);
使用 MysqlWorkbench 时,该错误具有误导性。我的问题是,我试图在已经有行且其中一行为空的表上添加外键约束(不满足 FK 约束)。MysqlWorkbench 没有抱怨如果应用该约束就会失败,而是报告该表存在。
删除固定的有问题的行(或向字段添加和约束可接受的值)解决了问题。
短: 由于以下原因,我遇到了此错误:“外键名称在整个数据库中必须是唯一的”
如果您没有为外键指定名称,自动生成的名称也会遇到同样的问题。
背景: 在我的修复活动中,我发现了这一点,这给了我修复提示: 写入或更新时密钥重复?
在过去,我确实与外键约束作斗争,因此在同一个数据库中有不同的“测试表”。其中一个外键的名称完全相同,因此该名称被阻止。 删除我的测试表解决了这个问题。重命名密钥可能也能做到这一点。