MySQL的外键'删除限制'条款的确切含义

时间:2011-11-09 22:52:42

标签: mysql foreign-keys

我有两个MySQL表:collectionsprivacy_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条款,我无法从在线手册或Google搜索中获得答案。

这是否意味着我永远不会privacy_level删除一行? 或者,这是否意味着我无法privacy_level 中删除一行来自collections.privacy的行具有与privacy_level.level相同的值privacy_level中的值?

也就是说,如果level = 2name = 'top secret'privacy = 2但在馆藏中没有条目。隐私有level = 2,我可以删除name = 'top secret',{{ 1}}进入?或者是否在列宽范围内被禁止?

感谢您的任何见解。

2 个答案:

答案 0 :(得分:94)

ON DELETE RESTRICT表示无法删除指定的父行,如果子行存在,则引用该值的值父行。如果父行没有引用子行,则可以删除该父行。

ON DELETE RESTRICT几乎是多余的语法,因为这是外键的默认行为。

答案 1 :(得分:0)

此外,您可以使用ON DELETE CASCADE,这意味着当您删除父项时,所有子项都将自动删除,当您有一个与另一个包含某些参数或设置的表关联时,这非常有用。