2011-11-09 90 views
43

我有兩個MySQL表:collectionsprivacy_level
我定義他們有外鍵關係這樣:MySQL的外鍵'刪除限制'的確切含義'條款

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行具有的值是相同privacy_level.level的值刪除行?

也就是說,如果privacy_levellevel = 2name = 'top secret'但collections.Privacy沒有條目具有privacy = 2,我可以刪除level = 2name = 'top secret'進入?還是禁止在列寬的基礎上?

感謝您的任何見解。

回答

85

ON DELETE RESTRICT意味着你不能刪除一個給定的父行如果子行存在引用,該父行的值。如果父行沒有引用子行,則可以刪除該父行。

ON DELETE RESTRICT幾乎是多餘的語法,因爲這是外鍵的默認行爲。

+0

你的意思是'ON DELETE RESTRICT'與'ON DELETE NO ACTION'相同嗎? – Shafizadeh

+0

@Shafizadeh,閱讀http://www.vertabelo.com/blog/technical-articles/on-delete-restrict-vs-on-delete-no-action –

+0

@Bill,該文章說,沒有行動是相同的RESTRICT在MySQL中,它引用[回到SO](https://stackoverflow.com/questions/5809954/mysql-restrict-and-no-action)來支持他們的聲明... – Code4R7

0

你也可以使用ON DELETE CASCADE,這意味着當你刪除父母時,所有的孩子都會被自動刪除,當你有一個表與另一個包含一些參數或設置的表相關聯時,這很有用。