我有一个带有列的表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 \ registration'已经存在。
如果我尝试使用UI使用Alter Table对话框的Foreign Keys选项卡添加外键,并选择CustomizationSet作为引用表,则不允许我在列列表中选择customization_set_guid。
我真的不确定为什么它不会让我添加这个外键。我刚刚在我刚刚添加的表之间成功创建了外键。注册表已经存在了一段时间......
答案 0 :(得分:8)
我得到了同样的错误,这是因为外键已经存在。你想要的只是添加约束:
ALTER TABLE Registration
ADD CONSTRAINT idx_Registration_CustomizationSet
FOREIGN KEY (customization_set_guid)
REFERENCES CustomizationSet(customization_set_guid);
答案 1 :(得分:2)
在MySQL这里看起来有一个错误报告:
最后,我猜他们升级了服务器并修复了问题。从阅读它,我不确定。他们确实有一些解决方法,比如输入约束名称/更改它们。如果您认为这是相同的,我会要求重新打开该错误。
有一次,他们提到类型不匹配,工作台正在响应错误的错误(它应该是一个错误的150,或者错误的错误121)。您可以在此处查看这些错误的原因: MySQL Foreign Key Errors and Errno 150
答案 2 :(得分:2)
因此,一名团队成员发现了这一点。一个表的类型为utf8_general,另一个表的类型为default。我不认为这是一个问题,因为默认是utf8_general,但显然mysql只是查看类型名称而不是底层类型。
答案 3 :(得分:1)
我得到了同样的错误,因为我的案子还没有提到,我会发布这个答案,希望这可以节省一些时间!
我的两个表引擎,不同之处。 一个是InnoDB,另一个是MyIsam。
要更改表格的引擎:
选择表格,点击alter table,然后点击该双箭头 最右边的工作台(因此它会指向上方)。
现在改变引擎!
答案 4 :(得分:1)
- 检查CustomizationSet表的存储引擎类型。
我有同样的问题,但我可以通过将引擎类型更改为来解决它 InnoDB,因为很少有类型不支持外键约束。
答案 5 :(得分: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);
答案 6 :(得分:0)
不确定已存在的表,但是它不允许您选择所需列的原因很可能是由于列不是同一类型。检查以确保它们的类型相同,长度相同,并且具有相同的选项。
答案 7 :(得分: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);
答案 8 :(得分:0)
使用MysqlWorkbench时,错误会产生误导。我的问题是我试图在已经有行的表上添加外键约束,其中一行是空的(不符合FK约束。而不是抱怨如果应用约束将失败,MysqlWorkbench报告该表存在。
删除固定的违规行(或向字段添加和约束可接受的值)解决了问题。