mysql で外部キー制約を設定する方法: FOREIGN KEY キーワード、構文「ALTER TABLE テーブル名 ADD CONSTRAINT 外部キー名 FOREIGN KEY (列名) REFERENCES メイン テーブル名 (列名) );"。
(推奨チュートリアル: mysql ビデオ チュートリアル )
(1) 外部キーの使用:
外部キーには主に 2 つの機能があります:
1 つは、データベース自体 外部キーを通じてデータの整合性と一貫性を確保する
1 つは、ER 図の可読性を高めることです
外部キーを確立すると、開発中にデータベースに多くの問題が発生すると考える人もいます。データベース 開発者は、外部キーの検出に失敗するため、削除または挿入操作に失敗することがあります。開発者は、これが非常に面倒だと考えています。実際、この正式な外部キーにより、データの整合性と一貫性を確保する必要があります。これは良いことです。
例:
製品に関するすべての情報を記録するために使用される基本データ テーブルがあります。他のテーブルにはすべて製品 ID が格納されます。クエリを実行するときは、テーブルを結合して製品名をクエリする必要があります。資料 1 の製品テーブルには製品 ID フィールドがあり、資料 2 の製品テーブルにも製品 ID フィールド
があります。外部キーを使用しない場合、ドキュメント 1 と 2 の両方で製品 ID = 3 の製品が使用されている場合、製品テーブル内の ID = 3 の対応するレコードを削除すると、表示したときに製品を見つけることができなくなります。文書 1 および 2。名前。 テーブルの数が少ない場合、プログラムの実装時にスクリプトを記述することでデータの整合性と一貫性を確保できると考える人もいます。つまり、製品を削除する場合は、製品 ID 3 の製品
が文書 1 と 2 で使用されているかどうかを確認します。ただし、スクリプトの作成が完了すると、システムはドキュメント 3 を追加します。これにより、製品 ID も保存され、フィールドが検索されます。外部キーを使用しない場合でも、製品名を見つけることができません。製品 ID フィールドを使用する ドキュメントを追加するたびに、製品が使用されているかどうかを検出するようにスクリプトを変更して戻って変更することはできません。同時に、外部キーを導入すると速度とパフォーマンスが低下します。
(2) 外部キーの追加形式:ALTER TABLE yourtablename
ADD [CONSTRAINT 外部キー名] FOREIGN KEY [id] (index_col_name , ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
[ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
[ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
RESTRICT}]
説明:
削除時/更新時、削除および更新操作の定義に使用されます。次に、更新および削除操作のさまざまな制約タイプを示します:
CASCADE:
外部キー内の外部キーテーブル フィールド値が更新されるか、フィールド値が存在する列が削除されます。
RESTRICT:
RESTRICT はアクションなし、つまり操作は実行されないことにも相当します。つまり、親テーブルです。外部キーに関連付けられた列の更新とレコードの削除が拒否されました。
set null:
親の外部キーに関連付けられたフィールドが更新または削除されると、子テーブルの外部キー列は null に設定されます。 挿入の場合、子テーブルの外部キー列に入力される値は、親テーブルの外部キーに関連付けられた列の既存の値のみです。それ以外の場合は、エラーが発生します。
外部キー定義は次の条件に従います: (前提条件)
1)
すべてのテーブル InnoDB タイプである必要があり、一時テーブルにすることはできません。InnoDB タイプのテーブルのみがサポートされるためです。 MySQL の外部キー。
2)
外部キーとして確立されるすべてのフィールドにはインデックスが付けられている必要があります。
3)
InnoDB 以外のテーブルの場合、FOREIGN KEY 句は無視されます。
注:
外部キーを作成する場合、外部キー名を定義するときに引用符を追加することはできません。
例: 制約 'fk_1' または制約 "fk_1" は間違っています( 3) 外部キーの表示:
SHOW CREATE TABLE ***;新しく作成されたテーブルとそのストレージ エンジンのコードを表示できます。また、外部キーの設定も確認できます。
外部キーの削除key:
alter table drop external key 'foreign key name'.
Note:
外部キーを定義する場合にのみ、外部キーの削除を容易にするために制約外部キー名を使用します。
定義されていない場合は、次の操作を行うことができます:
最初に入力します: alter tabledrop external key --> エラーが表示されます。この時点で、エラー メッセージには外部キーのシステム デフォルトの外部キー名が表示されます。 . --->外部キーを削除するために使用します。
#(4) 例
### シリーズ 1:
4.1
テーブルの親の作成 (ID Int Not Null、
主キー (id)
) Type = InnoDB;- Type = InnoDB は Engine = と同等です。 innodb
CREATE TABLE child(id INT,parent_id INT,
INDEX par_ind (parent_id),
FOREIGN KEY (parent_id) REFERENCESparent(id)
ON DELETE CASCADE
) TYPE=INNODB;
親にデータを挿入した後、子にデータを挿入します。挿入するとき、子のparent_idの値は親のデータのみにすることができます。そうでない場合、挿入は成功しません。
親レコードを削除するとき、子の対応するレコードも削除されます;->理由: 削除カスケード
親レコードを更新する場合、親レコードは更新されません;->定義されていないため、デフォルトは制限.
4.2
子が次の場合:
mysql>
create table child(id int not null 主キー auto_increment,parent_id int,
index par_ind (parent_id),
constraint fk_1 外部キー (parent_id) 参照
parent(id) on update cascade on deletestrict)
type=innodb;
上記を使用します:
1).
親レコードに対応する子のレコードも更新されます;-> 理由: 更新カスケード
2).
は、親テーブルに影響を与える子テーブル操作にはできません。親であることのみが可能です。子テーブルに影響を与えるテーブル。
3).
外部キーの削除:
テーブルの子を変更して外部キー fk_1 を削除;
外部キーを追加:
テーブルの子を変更して制約を追加 fk_1 外部キー ( parent_id) 参照
parent(id) 更新時は削除セット null;
(5) 複数の外部キーが存在します:
product_order テーブルには、他の 2 つのテーブルへの外部キーがあります。
外部キーは、製品テーブル内の 2 列のインデックスを指します。 Customer テーブルで引用されている別の 1 行インデックス:
Create table Product (Category Int Not Null, ID Int Not Null,
Price Decimal,
Primary Key (Category, ID)) Type = Innodb #;
CREATE TABLE customer (id INT NOT NULL,
主キー (id)) TYPE=INNODB;
CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
product_category INT NOT NULL,
product_id INT NOT NULL、
customer_id INT NOT NULL ,
主キー(いいえ),
-- 双外键
INDEX (product_category、product_id),
FOREIGN KEY (product_category, product_id)
REFERENCES product(category, id)
削除制限時の更新カスケード、
-单外键
index(customer_id)、
foreign key(customer_id)
customer(id))タイプ= innodb;
(6) 注釈:
1.更新/削除に関しては、制限付きの方法が採用されています。外部制限の場合は、 ON UPDATE CASCADE ON DELETE RESTRICT の方法を採用するのが最善です。
以上がmysqlで外部キー制約を設定するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。