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

Don*_*ble 49 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;  
Run Code Online (Sandbox Code Playgroud)

我的问题是关于该ON DELETE RESTRICT条款,我无法从在线手册或谷歌搜索中得出答案.

这是否意味着我永远不能从中删除一行privacy_level
或者,是否意味着我不能删除一行,privacy_level 如果某行collections.privacy的值与值中的值相同privacy_level.level

也就是说,如果privacy_levellevel = 2,name = 'top secret'但在collections.Privacy没有条目都有privacy = 2,我可以删除level = 2,name = 'top secret'录入?或者是否在列宽范围内被禁止?

感谢您的任何见解.

Bil*_*win 99

ON DELETE RESTRICT意味着你不能删除一个给定的父行,如果一个孩子行存在引用,该父行的值.如果父行没有引用子行,则可以删除该父行.

ON DELETE RESTRICT是非常多余的语法,因为这是外键的默认行为.

  • 您的意思是“ON DELETE RESTRICT”与“ON DELETE NO ACTION”相同吗? (2认同)
  • @Bill,该文章说“ NO ACTION”与MySQL中的“ RESTRICT”相同,它指的是[back to SO](/sf/ask/406696811/)以支持其操作。声明... (2认同)
  • @Code4R7 参见“指定 RESTRICT(或 NO ACTION)与省略 ON DELETE 或 ON UPDATE 子句相同。” https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html (2认同)

jos*_*uez 7

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

  • 哪一行是父行,哪一行是子行?是指另一个孩子还是相反? (2认同)
  • 如果您有两个表:users 和 user_settings,则用户表是父表,用户设置表是子表。因此,当您删除用户时,会自动删除与已删除用户相关的设置。 (2认同)