我有两个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
条款,我无法从在线手册或Google搜索中获得答案。
这是否意味着我永远不会从privacy_level
删除一行?
或者,这是否意味着我无法从privacy_level
中删除一行来自collections.privacy
的行具有与privacy_level.level
相同的值privacy_level
中的值?
也就是说,如果level = 2
有name = 'top secret'
,privacy = 2
但在馆藏中没有条目。隐私有level = 2
,我可以删除name = 'top secret'
,{{ 1}}进入?或者是否在列宽范围内被禁止?
感谢您的任何见解。
答案 0 :(得分:94)
ON DELETE RESTRICT
表示无法删除指定的父行,如果子行存在,则引用该值的值父行。如果父行没有引用子行,则可以删除该父行。
ON DELETE RESTRICT
几乎是多余的语法,因为这是外键的默认行为。
答案 1 :(得分:0)
此外,您可以使用ON DELETE CASCADE
,这意味着当您删除父项时,所有子项都将自动删除,当您有一个与另一个包含某些参数或设置的表关联时,这非常有用。