web-dev-qa-db-ja.com

MySQLのデフォルトのON DELETE動作は何ですか?

MySQLを解析しようとしています docs 。彼らはより明確になる可能性があります。彼らが言っていることは、SET NULL、NO ACTION、RESTRICT、CASCADE、およびSET DEFAULTの5つの可能性があるということです。

NO ACTIONとRESTRICTは同じことを行い(FKを壊すDBの変更を防ぎます)、そのことはデフォルトなので、ON DELETE句を省略した場合はNO ACTION(またはRESTRICT-同じこと)と言います。

SET NULLは親行の削除を許可し、FKをNULLに設定します。

CASCADEは子行を削除します。

SET DEFAULTは決して使用しないでください。

これは多かれ少なかれ正しいですか?

60
Ethan

はい、正しいです:

NO ACTION:[...] InnoDBは、親テーブルの削除または更新操作を拒否します。

[〜#〜] restrict [〜#〜]:親テーブルの削除または更新操作を拒否します。 RESTRICT(またはNO ACTION)を指定することは、ON DELETEまたはON UPDATE句を省略することと同じです。 [...]

どうやらNO ACTIONRESTRICTは同義語です。また、ON DELETE / UPDATE句がない場合は常に使用されるため、これがデフォルトの動作です。

SET NULL:親テーブルから行を削除または更新し、子テーブルの外部キー列をNULLに設定します。 [...]

NOT NULLとして宣言されていない場合(またはInnoDBは削除または更新を許可しない場合)、外部列はNULLに設定されます。

[〜#〜] cascade [〜#〜]:親テーブルから行を削除または更新し、子テーブル内の一致する行を自動的に削除または更新します。 [...]

カスケードは、外部列を削除(または更新)します。

SET DEFAULT:このアクションはパーサーによって認識されますが、InnoDBはON DELETE SET DEFAULTまたはON UPDATE SET DEFAULT句を含むテーブル定義を拒否します。

したがって、基本的にそのオプションは使用できません。

76
Anax