いくつかの計算された列でそれを行うことができますが、あまりきれいに見えません:
CREATE TABLE A (
A_UNIQUE_ID int NOT NULL PRIMARY KEY,
A_OTHER_ID int NOT NULL,
A_CURRENT_FL bit NOT NULL,
OTHER_XREF as CASE WHEN A_CURRENT_FL = 1 THEN A_OTHER_ID END persisted,
UNIQ as CASE WHEN A_CURRENT_FL = 0 THEN A_UNIQUE_ID ELSE 0 END persisted
constraint UQ_OTHER_XREF UNIQUE (OTHER_XREF,UNIQ)
)
INSERT INTO A VALUES (1, 1, 0);
INSERT INTO A VALUES (2, 1, 0);
INSERT INTO A VALUES (3, 1, 1);
CREATE TABLE B (
B_UNIQUE_ID int NOT NULL PRIMARY KEY,
A_OTHER_ID int NOT NULL,
XREF as 0 persisted,
constraint FK_B_A FOREIGN KEY (A_OTHER_ID,XREF) references A (OTHER_XREF,UNIQ))
これは機能します:
insert into B VALUES (2,1)
これにより、FK 制約が破られます。
insert into B VALUES (3,2)
テーブル A の 2 つの計算列により、A_CURRENT_FL
=を含むすべての行が1
内の個別の値としてそれを持つことが保証されOTHER_XREF
ます。他の行はNULL
その列に含まれます。ただし、制約 (外部キーのターゲット) を適用するには、 =を持つ行の既知の値でありながら、 をUNIQUE
持つ行ごとに明確に異なるものが必要です。この場合、既知の値を にしました。NULL
A_CURRENT_FL
1
0
最後に、外部キー制約はこれらの列の両方に一致する必要があるため、既知の値を持つ新しい計算列をテーブル B に追加します0
。
列名は特に良いものではありませんが、いくつか思い付くことができると確信しています。
また、上記により、言及されていない別の制約も実装されていることに注意してください。ただし、これも重要な場合があります。現在、テーブル A に両方がA_CURRENT_FL
1 に設定されている 2 つの行はありません。同じA_OTHER_ID
値。これもエラーを生成します。
INSERT INTO A VALUES (4,1,1);