添加外键到现有的表给出了错误1050表已经存在

问题描述:

我已经同列的表CustomizationSet:添加外键到现有的表给出了错误1050表已经存在

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 \ registra重刑“已经存在。

如果我尝试使用UI来添加具有Alter Table对话框的Foreign Keys选项卡的外键,并选择CustomizationSet作为引用表,它不会让我在列列表中选择customization_set_guid。

我真的不知道为什么它不会让我添加这个外键。我刚刚添加的表格之间成功创建了外键。该登记表已经存在一段时间了......

所以一个团队成员想通了。一个表的类型为utf8_general,另一个表的类型为default。我不认为这是一个问题,因为默认是utf8_general,但显然mysql只是查看类型名称而不是基础类型。

我不知道这是否是一个错字,但不应该是

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

返回同样的错误。我已经与语法创建的其它表上的其它外键很成功,它只是增加了一个默认的密钥名称 – avaleske

+0

嗯,它似乎有什么要做'1050表'。\ dbname \ registration''而不是外键。是否向另一个表中添加另一个外键工作正常? – ace

不能确定表已经存在,但是它不让你选择你想要的列的原因很可能是由于列不是相同的类型。检查以确保它们都是相同的类型,相同的长度,并具有所有相同的选项。

+0

他们既是char(36),也是注册表中的一个配给是可空的。这会有所作为吗? – avaleske

我得到了同样的错误,这是由于外键已存在的事实。你需要的是刚刚添加的约束:

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

+1

这实际上为我工作。显式给出约束名称的工作。奇怪,因为这张表没有现存的限制。 – Richard

+0

为我指定约束的名称时为我工作。它一定与另一个现有的限制相冲突。 – Magicode

它看起来像有在MySQL的这个错误报告位于:

MySQL Bug 55296

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

有一次,他们提到类型不匹配,工作台有错误的回应(应该是errno 150或errno 121)。你可以在这里看到这些错误的原因: MySQL Foreign Key Errors and Errno 150

我得到了同样的错误,由于我的案件尚未提及,我会发布这个答案,并希望它可以节省一些人的时间!

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

来改变发动机的表:

选择表,打表的改变,然后打的双箭头 最右侧的工作台(所以它会指向上方)。

现在改变引擎!

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

我有一个相同的问题,但我可以通过改变发动机类型 InnoDB的解决这个问题,因为一些类型不支持外键约束。

我有一个类似的问题,最后它是一个问题完整性约束。 “外键”列引用的是不存在 的外部列。

尝试运行下面来测试是否是这种情况:

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报告表存在。

卸下固定违规行(或增加和约束可接受值的字段)解决了这个问题。