参照制約付き表へのデータの挿入

参照制約付きの表にデータを挿入する際に、以下の規則を考慮する必要があります。

親キーが入っている親表にデータを挿入する場合、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')