web-dev-qa-db-ja.com

削除または更新時にアクションなしで外部キーを使用する理由

興味のある質問があります:

InnoDbを含む mysql に2つのテーブルがあります。
table tbl_aには、a_idという名前の主キーがあります。
table tbl_bには、プライマリb_idtbl_a.a_idに「ON DELETE NO ACTION」の外部キーがあります。

+-------------+---------------+---------------+
|  Table Name |  Primary Key  |  Foreign Key  |
+-------------+---------------+---------------+
|    tbl_a    |     a_id      |               |
|    tbl_b    |     b_id      |     a_id      |
+-------------+---------------+---------------+

とにかく最終的に外部キーの魔法を実際に使用しない場合、なぜInnoDbと外部キーを使用する必要がありますか?
まだ使用するポイントがあります
innodb および外部キー
の代わりに
myisam および外部キーなし
削除または更新で「NO ACTION」を実行するだけですか?

あなたが私の興味のポイントを得たことを願っています:)

21
Preexo

ON DELETE NO ACTIONの意味を誤解していると思います。 notは、外部キー制約を抑制することを意味します。

外部キーによって参照されるレコードを削除すると、InnoDBには状況を修正する自動アクションを実行する機能があります。

  • CASCADE、つまり、参照レコードを削除できます。 (これはuser_address.user_idのような場合に意味があります。ユーザーを完全に削除する場合は、ユーザーのアドレスもすべて完全に削除することをお勧めします。)
  • SET NULL、つまり、参照キーをクリアできます。 (これはfile.last_modified_byなどの場合に意味があります。ユーザーを完全に削除する場合、ファイルの最終変更者を単に「不明」にしたい場合があります。)

NO ACTIONを指定すると、InnoDBにこれらのアクションのいずれも実行させたくないことを伝えます。そのため、InnoDBは状況を修正できません。 DELETEを拒否してエラーを返すだけです。

結果として、ON DELETE NO ACTIONは実際にはON DELETE RESTRICT(デフォルト)と同じです。

(注:一部のDBMSおよび標準SQLでは、ON DELETE NO ACTIONON DELETE RESTRICTとは少し異なります。これらのON DELETE NO ACTIONは、「現在のトランザクション内でDELETEを受け入れますが、全体を拒否しますしかし、InnoDBは遅延チェックをサポートしていないため、ON DELETE NO ACTIONON DELETE RESTRICTとまったく同じように扱い、常にDELETEすぐに。)

MySQL 5.6リファレンスマニュアルの§§ 14.2.2.5 "外部キー制約" および 13.1.17.2 "外部キー制約の使用" を参照してください。

59
ruakh

ON DELETE / UPDATE CASCADEがなくても外部キー制約により、子テーブルに値を挿入した場合、親テーブルに値が正しく一致することが保証されます(またはFK列がNULL可能の場合はNULLです) 。子テーブルのFK列に無効な値を挿入しようとすると、制約が失敗したときにエラーが発生するため、データの整合性が保護されます。

エラー1452(23000):子行を追加または更新できません:外部キー制約が失敗します

外部キー制約を定義すると、子テーブルのFK列のインデックスも暗黙的に定義されます。インデックスを手動で定義できたとしても、結合のパフォーマンスが向上します。

ON DELETE NO ACTIONON DELETE句を省略するのと同じ)は積極的にprevent子テーブルによって参照されている親行を削除します。子行に影響を与えずに削除されました。

9