参照制約付き表へのデータの挿入
参照制約付きの表にデータを挿入する際に、以下の規則を考慮する必要があります。
親キーが入っている親表にデータを挿入する場合、SQL は次のものを認めません。
- 重複する親キーの値
- 親キーが基本キーである場合、基本キーの列に入っているヌル値
外部キーが入っている従属表にデータ挿入する場合は、次のとおりです。
- 外部キー列に挿入するそれぞれの非ヌル値は、親表の対応する親キーの値と等しくなければなりません。
- 外部キーのいずれかの列がヌル値である場合は、その外部キー全体がヌル値と見なされます。 その列を含むすべての外部キーがヌル値である場合は、INSERT が成功します (固有索引の違反がない限り)。
サンプルの業務プロジェクト表 (PROJECT) を変更して、次の 2 つの外部キーを定義します。
- 部門表を参照する部門番号 (DEPTNO) に対する外部キー
- 社員表を参照する社員番号 (RESPEMP) に対する外部キー
ALTER TABLE CORPDATA.PROJECT ADD CONSTRAINT RESP_DEPT_EXISTS FOREIGN KEY (DEPTNO) REFERENCES CORPDATA.DEPARTMENT ON DELETE RESTRICT ALTER TABLE CORPDATA.PROJECT ADD CONSTRAINT RESP_EMP_EXISTS FOREIGN KEY (RESPEMP) REFERENCES CORPDATA.EMPLOYEE ON DELETE RESTRICT
REFERENCES 文節に親表の列が指定されていないことに注意してください。 参照される表に親キーとして使用できる基本キーまたは適格な固有キーがある限り、これらの列を指定する必要はありません。
PROJECT 表に挿入されるすべての行には、部門表内の DEPTNO の値と等しい DEPTNO の値が入っていなければなりません。(プロジェクト表の DEPTNO を NOT NULL として定義してあるので、ヌル値は認められません。) さらに、行には、社員表内の EMPNO の値と等しいか、またはヌルの RESPEMP の値が入っていなければなりません。
次の INSERT ステートメントは、DEPARTMENT 表の中に一致する DEPTNO 値 ('A01') がないために失敗します。
INSERT INTO CORPDATA.PROJECT (PROJNO, PROJNAME, DEPTNO, RESPEMP)
VALUES ('AD3120', 'BENEFITS ADMIN', 'A01', '000010')
同様に、次の INSERT ステートメントは、EMPLOYEE 表に EMPNO 値 '000011' がないために失敗します。
INSERT INTO CORPDATA.PROJECT (PROJNO, PROJNAME, DEPTNO, RESPEMP)
VALUES ('AD3130', 'BILLING', 'D21', '000011')
次の INSERT ステートメントは、DEPARTMENT 表の中に一致する DEPTNO 値 'E01' があり、EMPLOYEE 表の中に一致する EMPNO 値 '000010' があるため、正常に完了します。
INSERT INTO CORPDATA.PROJECT (PROJNO, PROJNAME, DEPTNO, RESPEMP)
VALUES ('AD3120', 'BENEFITS ADMIN', 'E01', '000010')