2

テーブルにいくつかの参照整合性制約を記述してほしいという割り当てに取り組んでいます。Outcomes のすべての戦闘が Battles でも​​言及されていることを確認し、参照値を NULL に設定してすべての違反を処理するように求めています。

私は次のスキーマで作業しています

Battles(
    name VARCHAR(255) PRIMARY KEY, 
    date VARCHAR(255), 
)
Outcomes(
    ship VARCHAR(255),
    battle VARCHAR(255),
    RESULT VARCAHR(255),
    PRIMARY KEY(ship, battle)
)

次のように外国語キーを追加しようとしています:

alter table outcomes 
add foreign key (battle) 
references battles(name) 
on delete set null 
on update cascade;

次のエラーが表示されます。

SQL error:

ERROR:  insert or update on table "outcomes" violates foreign key constraint "outcomes_battle_fkey"
DETAIL:  Key (battle)=(Pearl Harbor 

これは、「パール ハーバー」が OUTCOMES にあり、BATTLES にはないためです。知りたいのは、その事実を無視して外部キーを設定する方法があるかどうかです。

4

2 に答える 2

3

また、参照値を NULL に設定してすべての違反を処理します。

battleは の PK の一部であるためOutcomes、NULL にすることはできません。あなたのデータモデルは、「戦いのない」結果を処理するように構築されていません。


モデルを変更してbattle子テーブルの PK から削除する場合は、次の方法でデータを「修正」できます。

UPDATE Outcomes SET battle = NULL
WHERE battle NOT IN (SELECT battle FROM Battles)

この時点で、違反を引き起こすことなく FK を作成できます (FK は非 NULL フィールドにのみ適用されます)。

于 2012-11-03T23:23:18.167 に答える
1

キーの作成時にチェックを防止するオプションを探す必要があります。Sql Server の場合は次のようになりWITH NOCHECKます。

テーブル内のデータが、新しく追加または再有効化された FOREIGN KEY または CHECK 制約に対して検証されるかどうかを指定します。指定しない場合、新しい制約には WITH CHECK が想定され、再有効化された制約には WITH NOCHECK が想定されます。

于 2012-11-03T23:14:13.853 に答える