将外键添加到现有表中会出现错误1050表

时间:2011-08-10 23:08:28

标签: mysql foreign-keys mysql-workbench mysql-error-1050

我有一个带有列的表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。

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

9 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:2)

在MySQL这里看起来有一个错误报告:

MySQL Bug 55296

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

有一次,他们提到类型不匹配,工作台正在响应错误的错误(它应该是一个错误的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报告该表存在。

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