【问题标题】:What's the different between RESTRICT and NO ACTION?RESTRICT 和 NO ACTION 有什么区别?
【发布时间】:2016-09-05 22:43:20
【问题描述】:
我正在尝试在列上创建一个 FK,现在我在想我应该在什么时候使用 ON DELETE RESTRICT? (或ON UPDATE RESTRICT)。不是和NO ACTION一样吗?
ON DELETE RESTRICT 表示如果存在引用该父行的值的子行,则不能删除给定的父行。如果父行没有引用子行,则可以删除该父行。无论如何,它的定义是外键的默认行为。
我错过了什么吗?
【问题讨论】:
标签:
mysql
sql
foreign-keys
【解决方案1】:
它们是等价的。它甚至在documentation 中这么说:
NO ACTION:标准 SQL 中的关键字。在 MySQL 中,相当于RESTRICT。
在具有延迟检查的数据库中它们之间存在差异,但 MySQL 没有。
【解决方案2】:
当您将约束定义为 deferable 并带有 initially deferred 或 initial immediate 模式时,唯一的区别就出来了。
NO ACTION:在标准 SQL 中,NO ACTION 意味着没有任何操作,即如果存在相关的外键值,则不允许尝试删除或更新主键值。引用的表。 InnoDB 拒绝父表的删除或更新操作。
RESTRICT:拒绝父表的删除或更新操作。指定 RESTRICT(或 NO ACTION)与省略 ON DELETE 或 ON UPDATE 子句相同。 (有些数据库系统有延迟检查,NO ACTION是延迟检查。在MySQL中,外键约束是立即检查的,所以NO ACTION和RESTRICT是一样的。)
见:
SQL SET CONTRAINS