MySQL的外键“删除限制”条款的确切含义
我有两个MySQL表: collections
和privacy_level
。
我用一个外键关系来定义它们:
CREATE TABLE collections ( coll_id smallint NOT NULL AUTO_INCREMENT UNSIGNED, name varchar(30) NOT NULL, privacy tinyint NOT NULL UNSIGNED DEFAULT '0', PRIMARY KEY(coll_id), INDEX(privacy), FOREIGN KEY fk_priv (privacy) REFERENCES privacy_level (level) ON UPDATE CASCADE ON DELETE RESTRICT ) ENGINE=InnoDB; CREATE TABLE privacy_level ( level tinyint NOT NULL UNSIGNED, name varchar(20) NOT NULL, PRIMARY KEY (level) ) ENGINE InnoDB;
我的问题是关于ON DELETE RESTRICT
子句,我无法从在线手册或谷歌search中得出答案。
这是否意味着我永远不能从privacy_level
删除一行?
或者,这是否意味着如果来自collections.privacy
的行的值与privacy_level.level
的值相同,我无法从privacy_level
删除一行?
也就是说,如果privacy_level
level = 2
, name = 'top secret'
但没有collections中的条目。 privacy = 2
,我可以删除level = 2
, name = 'top secret'
条目? 还是禁止在列的基础上?
感谢您的任何见解。
ON DELETE RESTRICT
表示如果存在引用该父行的值的子行 , 则不能删除给定的父行。 如果父行没有引用子行,则可以删除该父行。
ON DELETE RESTRICT
是非常多余的语法,因为这是外键的默认行为。
你也可以使用ON DELETE CASCADE
,这意味着当你删除父母时,所有的孩子都会被自动删除,当你有一个与另一个包含一些参数或设置的表相关的表时,这是很有用的。