27

我有一个感兴趣的问题:

我在中有2 个表InnoDb
tbl_a有一个主键,名为a_id;
tbl_b有一个主b_id键和一个外键,tbl_a.a_id带有“ ON DELETE NO ACTION”。

+-------------+---------------+---------------+
|  Table Name |  Primary Key  |  Foreign Key  |
+-------------+---------------+---------------+
|    tbl_a    |     a_id      |               |
|    tbl_b    |     b_id      |     a_id      |
+-------------+---------------+---------------+

如果我最终没有真正使用外键的魔力,我为什么还要使用 InnoDb 和外键?
使用
和外键
代替
和没有外键是否还有意义。
如果我只是NO ACTION对删除或更新执行“”?

我希望你能得到我的兴趣点:)

4

2 回答 2

84

我想你误解了什么ON DELETE NO ACTION意思。这并不意味着抑制外键约束。

当您删除由外键引用的记录时,InnoDB 能够采取自动操作来纠正这种情况:

  • 它可以CASCADE,意思是,删除引用记录。(这对于类似的东西是有意义的user_address.user_id。如果你硬删除一个用户,你可能也想硬删除所有用户的地址。)
  • 它可以SET NULL,意思是,清除引用键。(这可能对类似file.last_modified_by.

如果您指定NO ACTION,则您是在告诉 InnoDB 您不希望它采取这些操作中的任何一个。所以 InnoDB 无法为你解决问题;它所能做的就是拒绝DELETE并返回错误。

结果,ON DELETE NO ACTION实际上与ON DELETE RESTRICT(默认)相同。

(注意:在某些 DBMS 和标准 SQL 中,ON DELETE NO ACTION有点不同于ON DELETE RESTRICT: 在那些中,ON DELETE NO ACTION表示“接受DELETE当前事务,但如果我在纠正问题之前尝试提交它,则拒绝整个事务”。但 InnoDB 没有'不支持延迟检查,因此它的处理ON DELETE NO ACTION方式与 完全相同,并且总是立即ON DELETE RESTRICT拒绝。)DELETE

请参阅MySQL 5.6 参考手册中的 §§ 14.2.2.5 “外键约束”13.1.17.2 “使用外键约束”

于 2012-08-23T17:14:03.327 回答
9

即使没有外键约束,也ON DELETE / UPDATE CASCADE可以确保在将值插入子表时,它在父表中具有正确匹配的值(或者NULL如果 FK 列可以为空)。尝试在子表的 FK 列中插入无效值会在约束失败时导致错误,从而保护您的数据完整性。

ERROR 1452 (23000):无法添加或更新子行:外键约束失败

定义外键约束还隐式定义了子表中 FK 列上的索引,尽管您可以手动定义索引,但这将提高连接性能。

ON DELETE NO ACTION(与省略该ON DELETE子句相同)如果父行被任何子表引用,将主动阻止删除它,而不是被动地允许它被删除而不影响子行。

于 2012-08-23T17:10:57.957 回答