1. ホーム
  2. mysql

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

2023-07-30 23:33:40

質問

私は MySQL を解析しようとしています。 ドキュメント . 彼らはより明確であるべきです。彼らが言っているのは、5つの可能性があるということです。SET NULL、NO ACTION、RESTRICT、CASCADE、およびSET DEFAULTです。

NO ACTIONとRESTRICTは同じこと(FKを破壊するDB変更を防ぐ)を行い、そのことがデフォルトであるため、ON DELETE句を省略すると、NO ACTION(またはRESTRICT -- 同じこと)を言うことになります。

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

CASCADEは子行を削除します。

SET DEFAULTは決して使用すべきではありません。

これは多かれ少なかれ正しいのでしょうか?

どのように解決するのですか?

はい、その通りです。

アクションなし : [...] InnoDB は、親テーブルの削除または更新操作を拒否します。 を拒否します。

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

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

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

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

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

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

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

ですから、基本的にそのオプションは使用できません。