Skip to content

外部キー参照のあるテーブルへのデータ挿入及び削除手順(重要)

This content is not available in your language yet.

複数のテーブルにまたがって、外部キー制約のあるデータを作成する場合、入力シートへのデータ投入方法 のどの方式(直接入力・関数/マクロ・Copilot)を使うにしても共通して守るべき原則があります。この原則を誤ると、データ取り込み時に外部キー制約違反でエラーになります。

1. マスター参照がある場合は、参照元の情報を明示する

Section titled “1. マスター参照がある場合は、参照元の情報を明示する”

トランザクションテーブルの項目に、マスターテーブルの ID を参照する外部キーがある場合、そのマスター ID がどのワークブック・どのシートに存在するかを明確にしておきます。

  • 直接入力 や 関数・マクロ の場合:XLOOKUP などで参照する際に、参照先シート名・セル範囲を正確に指定します。
  • Copilot の場合:指示を出す際に「取引先IDは 顧客マスター.xlsx の clients シートの client_id 列から選んでください」のように、参照元のワークブックとシート名を明示的に伝えます。

2. 自己参照テーブルは「参照される側」を前方に作成する

Section titled “2. 自己参照テーブルは「参照される側」を前方に作成する”

部門マスターのように、自分自身のテーブルを参照する項目(例:課の親部門として本部の department_id を参照する)を持つテーブルでは、参照されるデータ(親)を、参照するデータ(子)より前の行に作成します。

3. データ取り込み実行時:参照される側を先に処理する

Section titled “3. データ取り込み実行時:参照される側を先に処理する”

複数テーブルをテーブルグループとしてまとめてデータ取り込み(INSERT)を行う場合、テーブルグループ 内のテーブル処理順序も、参照されるテーブルを先、参照するテーブルを後に並べます。

例:マスター(部門・従業員・取引先)→ トランザクションヘッダ(見積・契約)→ トランザクション明細、の順。

4. データ削除時:逆順オプションを使う

Section titled “4. データ削除時:逆順オプションを使う”

INSERT 用に作られた順序(参照されるテーブル→参照するテーブル)のまま DELETE を実行すると、外部キー制約により参照されている側から先に消せず削除が失敗します。

これに対応するため、データ取り込みダイアログ には「DELETE時にテーブル順・行順を逆順にする」オプションがあります。これを ON にすると、テーブルの処理順序とテーブル内の行の処理順序の両方が反転し、参照する側(子)から先に削除されます。

1. 自己参照テーブルとマスター参照があるテーブルへのデータ投入でエラーとなる場合

Section titled “1. 自己参照テーブルとマスター参照があるテーブルへのデータ投入でエラーとなる場合”
  1. データ取り込みを行う対象テーブルとして、departments(部門マスター)とemployees(従業員マスター)を、この順番で選択済みテーブルリストに配置します。

    • departments(部門マスター)は自己参照キーを、employees(従業員マスター)はdepartmentsへの外部参照キーを持ちます。
    • 選択済みテーブルリスト内では、ドラッグ&ドロップでテーブルの並び順を変更できます。

    アクティブなテーブルグループで、部門マスターと従業員マスターをこの順番で選択済みにテーブルに配置

  2. SC0005の親部門IDであるDB003は、SC0005より後の行で登録されるため、この行の登録時点ではまだ存在しません。そのため、このデータは自己参照キーエラーとなります。

    自己参照キーエラーを含む部門マスターの入力データ

  3. 部門ID:SC0005はdepartmentsシートのデータ取り込みでエラーになるため、存在しない部門IDのままになります。その結果、従業員ID:18000015は部門IDの外部参照キーエラーとなり、登録に失敗します。

    外部参照キーエラーを含む従業員マスターの入力データ

  4. このエラーデータを含む入力シートに対してデータ取り込みで[INSERT]を指定して実行すると、次のように処理結果でエラーが発生したことが通知されます。

    データ取り込みエラーが表示される

  5. 入力シートを開いて処理結果を確認します。部門マスターのSC0005は自己参照キーエラーとなり、処理成否=FALSE、処理失敗メッセージにはエラー内容と実行されたSQL文が表示されます。

    自己参照キーエラーを含む部門マスターの入力シートの取り込み結果

  6. 従業員マスターの18000015は外部参照キーエラーとなり、処理成否=FALSE、処理失敗メッセージにはエラー内容と実行されたSQL文が表示されます。

    外部参照キーエラーを含む従業員マスターの入力シートの取り込み結果

2. データ削除時:逆順オプションを使わない場合(承前)

Section titled “2. データ削除時:逆順オプションを使わない場合(承前)”
  1. エラーが出たので、いったん登録されたデータをすべて削除し、入力シートを直してデータ取り込みをやり直します。ここでは、まず試験的に正しくない手順で削除を実行してみます。データ取り込みダイアログで実行するSQLの種類に「Delete」を選択し、「INSERT実行時の逆順にDELETEを実行する」チェックボックスをOFFにします(既定ではON)。

    正しくない方法でDELETEを指示

  2. この状態でデータ取り込みを実行すると、次のように処理結果でエラーが発生したことが通知されます。

    DELETE処理エラーがIO操作画面に表示される

  3. 入力シートを開いて、departmentsシートのエラー内容を確認します。部門マスターのデータは、外部キー参照している従業員マスターのデータが存在する限り削除できません。つまり、先に従業員マスターを削除し、その後で部門マスターを削除する必要があります。

    • 最初のデータ取り込みでエラーになったSC0005はデータが存在しないため、DELETE SQLはエラーになりません。

    部門マスターの入力シートのデータが削除エラー

3. データ削除時:逆順オプションを使う場合(承前)

Section titled “3. データ削除時:逆順オプションを使う場合(承前)”
  1. 今度は、参照エラーのない正しい順序でデータが記載された入力シートを使い、INSERTでデータ取り込みを実行してから、正しい手順でデータを削除します。データ取り込みダイアログで実行するSQLの種類に「Delete」を選択し、「INSERT実行時の逆順にDELETEを実行する」チェックボックスは既定値のONのままにします。

    データ取り込みDELETEで逆順処理を選択

  2. 選択済みテーブルの並び順ではemployees(従業員マスター)はdepartments(部門マスター)より後ですが、「INSERT実行時の逆順にDELETEを実行する」がチェックされているため、employees(従業員マスター)が先に処理されます。さらに、入力データも下から上へ逆順に処理されます。

    従業員マスターが先に削除される

  3. 自己参照キーを持つdepartments(部門マスター)も、正しく削除されています。入力データを下から上へ逆順に処理するため、参照するデータを先に削除し、参照されるデータを後から削除する形になります。これにより、INSERT用に[参照されるデータ→参照するデータ]の順でセットした入力シートを、そのまま削除にも使えます。

    部門マスターも参照する側から参照される側の順で削除される