为什么要使用外键而不执行删除或更新操作

本教程将介绍为什么要使用外键而不执行删除或更新操作的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

为什么要使用外键而不执行删除或更新操作 教程 第1张

问题描述

我有一个感兴趣的问题:

我在 mysql 中有 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"?

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

推荐答案

我想你误解了 ON DELETE NO ACTION 的意思.它确实意味着抑制外键约束.

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

可以CASCADE,意思是删除引用记录.(这对于像 user_address.user_id 这样的东西是有意义的.如果您硬删除一个用户,您可能还想硬删除该用户的所有地址.)

可以SET NULL,意思是清除引用键.(这对于 file.last_modified_by 之类的内容可能有意义.如果您硬删除用户,您可能希望文件的 last-modified-by 变得简单未知".)

    it can CASCADE, meaning, delete the referring record. (This would make sense for something like user_address.user_id. If you hard-delete a user, you probably want to hard-delete all of the user's addresses as well.)

    it can SET NULL, meaning, clear out the referring key. (This might make sense for something like file.last_modified_by. If you hard-delete a user, you might want the file's last-modified-by to become simply "unknown".)

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

因此,ON DELETE NO ACTION实际上与ON DELETE RESTRICT(默认)相同.

(注意:在某些 DBMS 和标准 SQL 中,ON DELETE NO ACTIONON DELETE RESTRICT 有点不同:在那些中,ON DELETENO ACTION 表示接受当前事务中的 DELETE,但如果我在纠正问题之前尝试提交它,则拒绝整个事务".但 InnoDB 不支持延迟检查,所以它将 ON DELETE NO ACTION 视为与 ON DELETE RESTRICT 完全相同,并且始终拒绝 DELETE .)

参见 §§14.2.2.5外键约束" 和 13.1.17.2 MySQL 5.6 参考手册中的Using FOREIGN KEY Constraints".

好了关于为什么要使用外键而不执行删除或更新操作的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。