【问题标题】:Error while adding Foreign key添加外键时出错
【发布时间】:2014-02-12 02:44:39
【问题描述】:

我正在使用 Mysql Workbench。我已经做好了桌子。 现在我想在名为Personal_Details 的表中添加外键,该键是Login 表中的主键。

但是当我尝试这样做时,它会显示以下错误:

ERROR 1005: Can't create table 'shaadiDB.#sql-404_25' (errno: 121)

SQL 语句:

ALTER TABLE `shaadiDB`.`Personal_Details` 
  ADD CONSTRAINT `Login_Id`
  FOREIGN KEY (`Login_Id` )
  REFERENCES `shaadiDB`.`Login` (`Login_Id` )
  ON DELETE NO ACTION
  ON UPDATE NO ACTION
, ADD INDEX `Login_Id` (`Login_Id` ASC)

【问题讨论】:

  • “经常发生”是什么意思?您是否如此频繁地更改表结构?
  • 不,我不会经常更改表格

标签: mysql sql foreign-keys innodb foreign-key-relationship


【解决方案1】:

似乎Personal_Details 表有数据,其中可能有一些带有 Login_Id 的行的条目在表Login 中不存在。

如果是这种情况,那么解决方案是您需要将数据移动到另一个表,然后添加约束。添加约束后,您需要将所有行按 1 添加回表 1。

【讨论】:

  • 我无法选择索引列...为什么会这样?!
  • @AM26 我真的很惊讶是什么让您重新考虑接受的答案,因为我发现两者之间没有区别,补充说我已经解释了如何添加约束而不仅仅是一般性声明
【解决方案2】:

错误 121:当键名重复时会显式抛出此错误。

在运行Alter ... 语句后,立即执行以下命令并观察结果。

SHOW ENGINE InnoDB STATUS;

结果中的描述文本将告诉您在哪个键名上找到了重复项。 基于此,您修改您的 ALTER ... 语句并执行。

另外,您还可以通过执行以下命令来查找是否定义了任何此类重复的键名:

select constraint_name, constraint_type, table_name
from information_schema.table_constraints
where table_schema = DATABASE() -- and constraint_type = 'foreign key'

约束类型可以是 PRIMARY KEY、FOREIGN KEY 等任何类型。

如果您在结果中看到您尝试在ALTER .. 语句中使用的任何键名,您应该修改它们并执行。

【讨论】:

    【解决方案3】:

    在向已经有一些数据的表添加任何约束之前可能会导致此问题,请尝试在没有数据的情况下添加约束

    【讨论】:

    • 发布的错误不是由于数据重复,而是键名重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多