问题描述
我有一个感兴趣的问题:
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.
这篇关于为什么要使用外键而不执行删除或更新操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!