【问题标题】:Exact Meaning of MySQL's Foreign Key 'on delete restrict' ClauseMySQL的外键'on delete restrict'子句的确切含义
【发布时间】:2011-12-25 18:01:15
【问题描述】:

我有两个 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 子句,我无法从在线手册或谷歌搜索中得到答案。

这是否意味着我可以永远privacy_level 中删除一行?
或者,这是否意味着我不能privacy_level 中删除一行如果 collections.privacy 中的一行具有与@ 中的值相同的值987654328@?

也就是说,如果privacy_levellevel = 2name = 'top secret' 但集合中没有条目。隐私有privacy = 2,我可以删除level = 2name = 'top secret' 条目吗?还是在列范围内禁止?

感谢您的任何见解。

【问题讨论】:

    标签: mysql foreign-keys


    【解决方案1】:

    ON DELETE RESTRICT 表示您不能删除给定的父行,如果存在引用该父行值的子行 .如果父行没有引用子行,则可以删除该父行。

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 哪一行是父行,哪一行是子行?是那个引用另一个孩子还是反过来?
    • 如果你有两个表,users和user_settings,users的表是parent,user settings表是child。因此,当您删除用户时,会自动删除与已删除用户相关的设置。
    猜你喜欢
    • 2015-12-29
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多