1

Company と Employee の 2 つのテーブルがあるとします。Employee には Company への外部キーがあり、Company には Employee への外部キーがあります。参照整合性エラーを発生させずにこれらのテーブルにデータを挿入および削除するにはどうすればよいですか?

COMPANIES
 ID
 NAME
 CONTACT_EMPLOYEE_ID --FK

EMPLOYEES
 ID
 NAME
 COMPANY_ID --FK

これはかなり一般的な問題だと思います。調べてみましたが、あまり情報がありませんでした。おそらく、この問題は、私が認識していないより一般的な名前で発生します。

4

3 に答える 3

4

利用可能な方法はいくつかあります。

  1. 列はCONTACT_EMPLOYEE_IDヌル可能ですか? そうである場合は、会社を挿入し、従業員を挿入してから、会社のレコードを更新します。

  2. 制約の 1 つを延期可能として設定することもできます。次に、制約を延期として設定し、両方のレコードを挿入してからコミットできます。

于 2012-07-11T10:13:09.737 に答える
1

一般に、次の 2 つの戦略があります。

  • FK の 1 つを NULL 可能のままにします (そして、NULL をそのテーブルに挿入し、行を他のテーブルに挿入し、最後に NULL を更新します)。
  • FKの 1 つを延期します。

両方のFK を NULL 可能または遅延可能 (または 2 つの組み合わせ) のままにしておくこともできるため、両方向で挿入を実行できます。

また、すべての EMPLOYEES フィールドを COMPANIES に配置することも検討できます。

于 2012-07-11T10:15:48.070 に答える
0

既に行われた他の提案 (FK 列の 1 つを NULL 可能にする、または FK 制約を延期可能にする) とは別に、別の提案は NOT NULL 制約を延期可能にすることです。

create table COMPANIES (
 ID number not null,
 NAME varchar2(100) not null,
 CONTACT_EMPLOYEE_ID number,
 constraint contact_not_null
   check (CONTACT_EMPLOYEE_ID not null)
   deferrable
   initially deferred
);

これで、従業員 ID に NULL を含む行を挿入し、従業員を挿入してから、companys.contact_employee_id を新しい従業員 ID で更新してから、コミットできます。

于 2012-07-12T05:38:16.640 に答える