【问题标题】:Setting up foreign key in Mysql Workbench在 Mysql Workbench 中设置外键
【发布时间】:2013-01-24 23:22:27
【问题描述】:

我正在尝试在 Mysql 工作台中设置外键。我为外键使用了与我试图与之建立关系的表的主键相同的名称。我已经在另一个表中以这种方式设置了一个关系,但是当我尝试将更改应用于此表时,脚本给了我一个错误:

错误 1005:无法创建表 'X.#sql-718_a'(错误号:121)

SQL 语句:

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”,则设置外键关系没有问题。为什么会这样,为什么我不能让一个表中的主键名称与该表的外键相同?我之前已经建立了这样的关系,但对于这张桌子我不能。

【问题讨论】:

  • 请贴出X的表定义

标签: mysql mysql-workbench


【解决方案1】:

约束名称在数据库中必须是唯一的。

错误信息中的(errno: 121)表示MySQL遇到了重复键异常。造成这种情况的通常原因是数据库中已经存在同名的约束。

这种“唯一名称”要求是规范模式在构造外键约束名称时包含表名的原因之一。例如FK_table_cols 例如FK_X_use_XyzID.

为什么约束名称在数据库中必须是唯一的?这是 dbms 设计者的问题。

但是考虑一下:当数据库遇到约束冲突时,它会抛出一个包含约束名称的错误。当该约束名称仅引用数据库中的一个约束时,可以更轻松地定位问题。

【讨论】:

    【解决方案2】:

    您不能在数据库中使用相同的约束名称,如 DB 的 ACID 属性中所述。

    【讨论】:

    • 我想,我应该回去再彻底检查一下 DB 的 ACID 属性。谢谢!
    • 我不相信数据库的 ACID 属性指定外键约束的名称是否应该(或需要)唯一。当然,需要某种唯一标识符,但这也可以是 table_name/partition_name/constraint_name 的组合,而不会违反 A、C、I 或 D 属性。 (话又说回来,我可能需要重新接受这方面的教育。)
    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 2012-09-04
    • 2014-08-03
    • 2020-08-14
    • 2020-08-27
    • 1970-01-01
    • 2016-07-10
    • 2021-03-29
    相关资源
    最近更新 更多