興味のある質問があります:
InnoDb
を含む mysql に2つのテーブルがあります。
table tbl_a
には、a_id
という名前の主キーがあります。
table tbl_b
には、プライマリb_id
とtbl_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
」を実行するだけですか?
あなたが私の興味のポイントを得たことを願っています:)
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 ACTION
はON DELETE RESTRICT
とは少し異なります。これらのON DELETE NO ACTION
は、「現在のトランザクション内でDELETE
を受け入れますが、全体を拒否しますしかし、InnoDBは遅延チェックをサポートしていないため、ON DELETE NO ACTION
をON DELETE RESTRICT
とまったく同じように扱い、常にDELETE
すぐに。)
MySQL 5.6リファレンスマニュアルの§§ 14.2.2.5 "外部キー制約" および 13.1.17.2 "外部キー制約の使用" を参照してください。
ON DELETE / UPDATE CASCADE
がなくても外部キー制約により、子テーブルに値を挿入した場合、親テーブルに値が正しく一致することが保証されます(またはFK列がNULL可能の場合はNULL
です) 。子テーブルのFK列に無効な値を挿入しようとすると、制約が失敗したときにエラーが発生するため、データの整合性が保護されます。
エラー1452(23000):子行を追加または更新できません:外部キー制約が失敗します
外部キー制約を定義すると、子テーブルのFK列のインデックスも暗黙的に定義されます。インデックスを手動で定義できたとしても、結合のパフォーマンスが向上します。
ON DELETE NO ACTION
(ON DELETE
句を省略するのと同じ)は積極的にprevent子テーブルによって参照されている親行を削除します。子行に影響を与えずに削除されました。