【问题标题】:Using CONSTRAINT alogn with FOREIGN KEY使用 CONSTRAINT 与 FOREIGN KEY 对齐
【发布时间】:2018-10-11 00:31:30
【问题描述】:

我试图了解以这种方式创建 FOREIGN KEY 之间的区别:

CREATE TABLE child(
    id_child  INT NOT NULL,  
    id_parent INT 
    FOREIGN KEY(id_parent) REFERENCES parent(id_parent));

而不是这个:

CREATE TABLE child(
    id_child  INT NOT NULL,  
    id_parent INT 
    CONSTRAINT FK_id_parent FOREIGN KEY(id_parent) REFERENCES parent(id_parent));

如果我使用第一种形式,它无论如何都会创建一个CONSTRAINT(Innodb 索引,或者我错了吗?没有关于索引的说明)。那么,有什么需要明确声明CONSTRAINT 或者没有理由这样做?

【问题讨论】:

  • 从官方语法文档here 的外观来看,CONSTRAINT 是可选的,只有在您想(可选)命名约束时才需要。据我记得,命名约束的主要好处是更容易管理(即以后更容易删除)。

标签: mysql database foreign-keys constraints mysql-workbench


【解决方案1】:

使用 CONSTRAINT 关键字语法,我们可以根据我们选择的约定命名约束,而不是让 InnoDB 使用系统分配的名称。

这是唯一的区别。

(令人困惑的是,删除外键约束的语法不允许CONSTRAINT关键字,我们必须ALTER TABLE ... DROP FOREIGN KEY foo,其中foo是外键约束的名称,无论我们分配名称还是InnoDB 生成了它。)

是的,如果合适的索引尚不可用,InnoDB 会自动创建一个索引来支持外键。如果我们单独定义一个索引(例如使用KEY indexname (id_parent),那么外键约束的名称可以与索引不同。

【讨论】:

  • 是的,正如我所见,拥有 2 个元素来做一件事,索引是非常令人困惑的。例如如果我想references 一个特定的值,我应该通过constraint,我的意思是PK_idUser,或者直接通过列名,idUser
  • 创建一个INDEX 只是定义一个索引,它不强制引用完整性。在关系数据库理论中,行(元组)通过将公共值存储在要相关的行(元组上的属性)中的列中来相互“关联”。 FOREIGN KEY 约束是一种防止某些值存储在列中的机制。它归结为说“您不能在此列中存储值除非相同的值出现在某行的特定列中(通常在另一个表中)。
  • 列名只是标识符。我们可以选择混淆名称,数据库不会关心...FOREIGN KEY (xf54gfjlmmph) REFERENCES flurgl7stump (nj87cldgoop)。幸运的是,我们选择不对自己那么残忍,并遵循一些有助于我们理解事物的惯例。一个常见的约定是外键列与引用表中的列具有相同的名称(当表包含多个引用同一列的外键列时,该约定会失效。)添加前缀,例如“fk_”在外键列上是一种不太常见的模式
  • 不要将分配给 CONSTRAINT 的名称(标识符)与分配给列的名称混淆/混淆。在我们的商店中,我们用于外键约束(不是列)的命名约定是 FK_thistable_referencedtable(有时会添加角色鉴别符),也就是说,我们通常不会将所涉及的列名作为约束名的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-02
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 2020-08-11
相关资源
最近更新 更多