導入
MySQL の外部キー制約は、2 つのテーブル データ間のリンクを確立するために使用されます。一方のテーブルのフィールドは、もう一方のテーブルの対応するフィールドによって制約されます。つまり、外部キー制約を設定するには、少なくとも 2 つのテーブルが必要であり、制約が適用されるテーブルをスレーブ テーブル (子テーブル) と呼び、もう 1 つをマスター テーブル (親テーブル) と呼びます。奴隷関係。
テーブルの説明
現在、my_class (マスター テーブル) と my_stu (スレーブ テーブル) の 2 つのテーブルがあり、マスター テーブルとスレーブ テーブルは ID によって接続されています。
テーブルを作成する SQL ステートメント:
#主表
CREATE table my_class(
id int PRIMARY KEY,
`name` VARCHAR(32) not null
)
#从表
CREATE table my_stu(
id int PRIMARY KEY,
`name` VARCHAR(32),
class_id int ,
foreign key(class_id) REFERENCES my_class(id)
)
外部キーは制約をどのように反映するのでしょうか?
1. テーブルからデータを挿入する場合、メインテーブルに対応する外部キーが存在する必要があります。
my_class テーブル (メイン テーブル):
id (主キー) | 名前 |
---|---|
1 | 少人数クラス |
2 | 中流階級 |
3 | ビッグクラス |
insert into my_stu(id,name,class_id) values(1,"小花",4); #错误,class_id=4在主表中找不到对应的id=4
insert into my_stu(id,name,class_id) values(1,"小花",3); #正确,符合外键约束规范,主表中存在id=3
2. メインテーブルからデータを削除する場合は、削除したデータに関連するデータがスレーブテーブルに存在しないことを必ず確認してください。
たとえば、my_stu テーブルは現在存在します。
id (主キー) | 名前 | class_id (外部キー) |
---|---|---|
1 | 小花 | 1 |
2 | 小紅 | 2 |
3 | シャオ・チャン | 3 |
(1, floret, 1) がテーブルに存在するため、次の削除はエラーを報告します。
delete from my_class where id=1; #错误
まずスレーブ テーブルの関連データを削除し、次にマスター テーブルのデータを削除する必要があります。
delete from my_stu where class_id=1;#删除从表关联数据
delete from my_class where id=1;
予防
- 外部キーが指すメイン テーブル フィールドは主キーまたは一意である必要があります
- 外部キーをサポートするにはテーブルが innodb である必要があります
- 外部キーと主キーのタイプは一貫している必要があります
- 外部キーは null にすることができ、null の場合、メイン テーブルに対応する null が存在する必要はありません。