为什么要使用外键与删除或更新不采取行动(Why to use foreign keys with n

2019-06-27 07:35发布

我所关注的问题:

我有2代表的MySQL与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和外键,如果我真的不使用外键的魔力到底的呢?
是否有仍然使用点
InnoDB的外键
代替
MyISAM数据并没有外键
如果我只是做“ NO ACTION上删除或更新”?

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

Answer 1:

我想你误会什么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 立即 。)

见§§ 14.2.2.5“外键约束”和13.1.17.2“使用外键约束”了MySQL 5.6参考手册中给出。



Answer 2:

外键约束,即使没有ON DELETE / UPDATE CASCADE保证,如果你值插入子表,它具有在父表中的正确的匹配值(或NULL如果FK列可以为空)。 试图插入一个无效值到子表的FK列会显示错误当约束失败,那么你的数据完整性就会受到保护。

ERROR 1452(23000):不能添加或更新子行,外键约束失败

定义外键约束也隐含地定义在子表中的列FK,这虽然你可能已经手动定义的索引,将提高加盟性能的指标。

ON DELETE NO ACTION (这是一样的省略ON DELETE子句)将积极防止父行的删除,如果它是由任何子表引用,而不是被动地允许它在不影响孩子的行被删除。



文章来源: Why to use foreign keys with no action on delete or update