我正在尝试在Mysql工作台中设置一个外键。我使用相同的外键名称作为我试图建立关系的表的主键。我已经在另一个表中以这种方式设置了一个关系,但是当我尝试将更改应用于此表时,该脚本给出了一个错误:
错误1005 :无法创建表'X.#sql-718_a'(错误号:121)
ALTER TABLE `X`.`X_use`
ADD CONSTRAINT `XyzID`
FOREIGN KEY (`XyzID` ) REFERENCES `X`.`Xyz` (`XyzID` )
ON DELETE NO ACTION O
N UPDATE NO ACTION ,
ADD INDEX `XyzID` (`XyzID` ASC) ,
但是,如果我将外键名称更改为“AbcID”,则设置外键关系没有问题。为什么这个以及为什么我不能让一个表中的主键名对于该表的外键是相同的?我已经建立了以前的关系,但对于这张桌子我不能。
答案 0 :(得分:3)
约束名称必须在数据库中是唯一的。
错误消息中的(errno: 121)
表示MySQL遇到重复的密钥异常。通常的原因是数据库中已存在相同名称的约束。
这个“唯一名称”要求是规范模式在构造外键约束名称时包含表名的一个原因。例如FK_table_cols例如FK_X_use_XyzID
。
为什么约束名在数据库中必须是唯一的?这对于dbms设计师来说是一个问题。
但请考虑这一点:当数据库遇到约束违规时,它会抛出一个包含约束名称的错误。当该约束名称仅引用数据库中的一个约束时,这会使问题更容易定位。
答案 1 :(得分:0)
您不能在整个数据库中使用相同的约束名称,如DB的ACID属性中所述。