SQL FOREIGN KEY制約
SQL FOREIGN KEY制約
FOREIGN KEY
制約は、テーブル間のリンクを破壊するアクションを防ぐために使用されます。
FOREIGN KEY
は、あるテーブルのフィールド(またはフィールドの集まり)で、別のテーブルのPRIMARY KEY
を参照します。
外部キーを持つテーブルは子テーブルと呼ばれ、主キーを持つテーブルは参照テーブルまたは親テーブルと呼ばれます。
次の2つの表を見てください。
人物表
個人ID |
苗字 |
名前 |
年 |
---|---|---|---|
1 | ハンセン | オラ | 30 |
2 | スヴェンソン | トーベ | 23 |
3 | ペッターセン | カリ | 20 |
注文表
オーダーID |
注文番号 |
個人ID |
---|---|---|
1 | 77895 | 3 |
2 | 44678 | 3 |
3 | 22456 | 2 |
4 | 24562 | 1 |
「Orders」テーブルの「PersonID」列が「Persons」テーブルの「PersonID」列を指していることに注意してください。
"Persons"テーブルの"PersonID"列は、「Person」テーブルのPRIMARY KEY
です。
"Orders"テーブルの"PersonID"列は、「Order」テーブルのFOREIGN KEY
です。
FOREIGN KEY
制約は親テーブルに含まれる値の1つでなければならないため、外部キー列に無効なデータが挿入されるのを防ぎます。
CREATE TABLEのSQL FOREIGN KEY
次のSQLは"Orders"テーブルが作成されたとき"PersonID"列にFOREIGN KEY
を作成します。
MySQL:
CREATE TABLE Orders(
OrderID int NOT NULL,
OrderNumber int NOT NULL,
PersonID int,
PRIMARY KEY (OrderID),
FOREIGN KEY (PersonID) REFERENCES Persons(PersonID)
);
SQL Server/Oracle/MS Access:
CREATE TABLE Orders(
OrderID int NOT NULL PRIMARY KEY,
OrderNumber int NOT NULL,
PersonID int FOREIGN KEY REFERENCES Persons(PersonID)
);
FOREIGN KEY
制約に名前を付け、複数の列にFOREIGN KEY
制約を定義するには、以下のSQL構文を使用します。
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Orders(
OrderID int NOT NULL,
OrderNumber int NOT NULL,
PersonID int,
PRIMARY KEY (OrderID),
CONSTRAINT FK_PersonOrder FOREIGN KEY (PersonID)
REFERENCES Persons(PersonID)
);
ALTER TABLEのSQL FOREIGN KEY
"Orders"テーブルが既に作成されている場合に"PersonID"列にFOREIGN KEY
制約を適用するには、次のSQLを使用します。
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD FOREIGN KEY (PersonID)REFERENCES Persons(PersonID);
FOREIGN KEY
制約に名前を付け、複数の列にFOREIGN KEY
制約を定義するには、以下のSQL構文を使用します。
MySQL / SQL Server / Oracle / MS Access:
ALTER TABLE Orders
ADD CONSTRAINT FK_PersonOrder
FOREIGN KEY (PersonID)REFERENCES Persons(PersonID);
FOREIGN KEY制約を削除する
FOREIGN KEY
制約を削除するには次のSQLを使用します。
MySQL:
ALTER TABLE Orders
DROP FOREIGN KEY FK_PersonOrder;
SQL Server/Oracle/MS Access:
ALTER TABLE Orders
DROP CONSTRAINT FK_PersonOrder;
プログラミング学習を加速させる
プログラミングをプロの講師に教えてもらいませんか。