27

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

に2つのテーブルがありInnoDbます。
テーブルtbl_aには という名前の主キーがありa_idます。
テーブルtbl_bには" " のb_id主キーと外部キーがあります。tbl_a.a_idON DELETE NO ACTION

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

とにかく最後に外部キーの魔法を実際に使用しないのに、なぜ InnoDb と外部キーを使用する必要があるのでしょうか。の 代わりにと外部キー
を使用し、外部キーを使用しないという点はまだありますか。削除または更新時に " " を実行するとどうなりますか?



NO ACTION

あなたが私の興味を持っていることを願っています:)

4

2 に答える 2

84

ON DELETE NO ACTION意味を誤解していると思います。外部キー制約を抑制するという意味ではありません。

外部キーによって参照されているレコードを削除すると、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ます。しかし、InnoDB はそうではありません。は遅延チェックをサポートしていないため、 とまったく同じように扱い、常にすぐにを拒否します。)ON DELETE NO ACTIONDELETEON DELETE NO ACTIONON DELETE RESTRICTDELETE

MySQL 5.6 リファレンス マニュアルの§§ 14.2.2.5「FOREIGN KEY Constraints」および13.1.17.2「Using FOREIGN KEY Constraints」を参照してください。

于 2012-08-23T17:14:03.327 に答える
9

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

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

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

ON DELETE NO ACTIONON DELETE(句を省略するのと同じです)親行が子テーブルによって参照されている場合、親行の削除を積極的に防止し、子行に影響を与えずに受動的に削除することを許可しません。

于 2012-08-23T17:10:57.957 に答える