2011-11-09 4 views
43

私は2つのMySQLテーブル:collectionsprivacy_levelを持っています。
は私のような外部キー関係でそれらを定義します。MySQLの外部キーの正確な意味 'delete restrict'句

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から行を削除できますか?
それとも、それは私がcollections.privacyから行がprivacy_level.levelの値と同じ値を持っている場合privacy_levelから行を削除できないことを意味するのでしょうか? privacy_levellevel = 2name = 'top secret'を持っていますが、collections.Privacyにエントリがprivacy = 2を持っていない、私はlevel = 2name = 'top secret'エントリを削除することができれば、ある

?それとも列全体で禁止されていますか?

ありがとうございました。

答えて

85

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を参照してください。この記事では、NO ACTIONはRESTRICTと同じですMySQLでは、そして、それは[SOに戻る](https://stackoverflow.com/questions/5809954/mysql-restrict-and-no-action)を参照してください。 – Code4R7

0

また、ON DELETE CASCADEを使用すると、親を削除するとすべての子が自動的に削除されます。これは、いくつかのパラメータや設定を含む別のテーブルに関連付けられたテーブルを持つ場合に便利です。