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 ,这意味着当你删除父母时,所有的孩子都会被自动删除,当你有一个与另一个包含一些参数或设置的表相关的表时,这是很有用的。