2

外部キーの制約について疑問がありました。そこで、テスト用にこのような2つの簡単なテーブルを作成しました。

mysql> EXPLAIN parent;
+-------+---------+------+-----+---------+----------------+         
| Field | Type    | Null | Key | Default | Extra          |      
+-------+---------+------+-----+---------+----------------+      
| id    | int(11) | NO   | PRI | NULL    | auto_increment |      
+-------+---------+------+-----+---------+----------------+      
1 row in set (0.01 sec)                                          

mysql> EXPLAIN child;                                            
+-----------+---------+------+-----+---------+----------------+  
| Field     | Type    | Null | Key | Default | Extra          |  
+-----------+---------+------+-----+---------+----------------+  
| id        | int(11) | NO   | PRI | NULL    | auto_increment |  
| parent_id | int(11) | NO   | MUL | NULL    |                |  
+-----------+---------+------+-----+---------+----------------+  

現在、テーブルの作成時に外部キー制約を指定していません。後で次のように追加しました。

ALTER TABLE child                                                      
ADD CONSTRAINT parent_fk FOREIGN KEY(parent_id) REFERENCES parent(id); 

engineテーブルとそのに使用されているものを確認しましたInnoDB。私の質問は...

  1. いくつかの依存する子レコードがある親のレコードを削除することを制限しないのはなぜですか?デフォルトでは、それは私を制限するはずですよね?

  2. 外部キー制約を追加する前に外部キーフィールドにインデックスを作成すると、期待どおりに機能します。毎回そのようなインデックスを作成する必要がありますか?

  3. テーブルの作成後に何らかの制約を追加することは悪い習慣ですか?
4

1 に答える 1

4

ALTER TABLEMySQL を使用して新しい外部キー制約を追加する場合、フィールドにインデックスが必要です。制約は親テーブルのインデックスに対してチェックされるため、インデックスがないとチェックは行われません。

14.6.4.4. FOREIGN KEY 制約

ALTER TABLE を使用してテーブルに外部キー制約を追加するときは、最初に必要なインデックスを作成することを忘れないでください。

また、次のこともできます。

SQL 標準からの逸脱: 親テーブルに同じ参照キー値を持つ複数の行がある場合、InnoDB は、同じキー値を持つ他の親行が存在しないかのように、外部キー チェックで動作します。たとえば、RESTRICT タイプの制約を定義し、複数の親行を持つ子行がある場合、InnoDB はそれらの親行の削除を許可しません。

InnoDB は、外部キー制約に対応するインデックス内のレコードに基づいて、深さ優先アルゴリズムを通じてカスケード操作を実行します。

特定の質問に答えるには:

1)必要なインデックスを作成していないため、制限されていません。ドキュメントに記載されているように、アルゴは制約に対応するインデックスを使用します。

2) #1 を参照してください。はい、行が親テーブルに追加される前に FK が配置されていない限り。

3) いいえ、悪い習慣ではありません。意図を明確にする必要があるだけです。たとえばALTER、テーブルを ing した後に参照整合性をチェックしますか? これは潜在的に役立つ質問です: InnoDB にテーブルの外部キーを再チェックさせますか?

于 2013-02-05T17:35:02.283 に答える