Why to use foreign keys with no action on delete or update(为什么要使用外键而不执行删除或更新操作)
问题描述
我有一个感兴趣的问题:
I have a question of interest:
我在 mysql 中有 2 个表,其中 <代码>InnoDb.
表 tbl_a 有一个主键,名为 a_id;
表 tbl_b 有一个主 b_id 和一个在 tbl_a.a_id 上带有ON DELETE NO ACTION"的外键.
I have 2 tables in mysql with InnoDb.
table tbl_a has a primary key, named a_id;
table tbl_b has a primary b_id and a foreign key on tbl_a.a_id with "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"?
why should I still use InnoDb and foreign keys, if i don't really use the magic of foreign keys in the end in anyway?
Is there still a point of using
innodb and foreign keys
instead of
myisam and no foreign keys.
If I just do "NO ACTION" on deletes or updates?
我希望你能得到我的兴趣:)
I hope you got my point of interest :)
推荐答案
我想你误解了 ON DELETE NO ACTION 的意思.它确实不是意味着抑制外键约束.
I think you're misunderstanding what ON DELETE NO ACTION means. It does not mean to suppress the foreign-key constraint.
当您删除由外键引用的记录时,InnoDB 能够采取自动操作来纠正这种情况:
When you delete a record that is referred to by a foreign key, InnoDB has the ability to take an automatic action to rectify the situation:
- 可以
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 likeuser_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 likefile.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 并返回错误.
If you specify NO ACTION, you're telling InnoDB that you don't want it to take either of these actions. So InnoDB can't fix the situation for you; all it can do is reject the DELETE and return an error.
因此,ON DELETE NO ACTION实际上与ON DELETE RESTRICT(默认)相同.
As a result, ON DELETE NO ACTION is actually the same as ON DELETE RESTRICT (the default).
(注意:在某些 DBMS 和标准 SQL 中,ON DELETE NO ACTION 与 ON DELETE RESTRICT 有点不同:在那些中,ON DELETENO ACTION 表示接受当前事务中的 DELETE,但如果我在纠正问题之前尝试提交它,则拒绝整个事务".但 InnoDB 不支持延迟检查,所以它将 ON DELETE NO ACTION 视为与 ON DELETE RESTRICT 完全相同,并且始终拒绝 DELETE 立即.)
(Note: in some DBMSes, and in standard SQL, ON DELETE NO ACTION is a bit different from ON DELETE RESTRICT: in those, ON DELETE NO ACTION means "accept the DELETE within the current transaction, but reject the whole transaction if I try to commit it before rectifying the problem". But InnoDB doesn't support deferred checks, so it treats ON DELETE NO ACTION exactly the same as ON DELETE RESTRICT, and always rejects the DELETE immediately.)
参见 §§14.2.2.5外键约束" 和 13.1.17.2 MySQL 5.6 参考手册中的Using FOREIGN KEY Constraints".
See §§14.2.2.5 "FOREIGN KEY Constraints" and 13.1.17.2 "Using FOREIGN KEY Constraints" in the MySQL 5.6 Reference Manual.
这篇关于为什么要使用外键而不执行删除或更新操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:为什么要使用外键而不执行删除或更新操作
基础教程推荐
- while 在触发器内循环以遍历 sql 中表的所有列 2022-01-01
- MySQL根据从其他列分组的值,对两列之间的值进行求和 2022-01-01
- 如何在 CakePHP 3 中实现 INSERT ON DUPLICATE KEY UPDATE aka upsert? 2021-01-01
- ORA-01830:日期格式图片在转换整个输入字符串之前结束/选择日期查询的总和 2021-01-01
- 带有WHERE子句的LAG()函数 2022-01-01
- 带更新的 sqlite CTE 2022-01-01
- MySQL 5.7参照时间戳生成日期列 2022-01-01
- 从字符串 TSQL 中获取数字 2021-01-01
- CHECKSUM 和 CHECKSUM_AGG:算法是什么? 2021-01-01
- 使用 VBS 和注册表来确定安装了哪个版本和 32 位 2021-01-01
