NULL
値は制約に違反しません-2UNIQUE
つNULL
は等しいとは見なされません!したがって、単純なUNIQUE
制約は機能しません。
2つの部分UNIQUE
インデックスとCHECK
制約を使用してそれを実行できます。
CREATE TEMP TABLE foo (
a int
, b int
, c int NOT NULL
, d int NOT NULL
, CHECK ((a IS NOT NULL AND b IS NULL) OR (b IS NOT NULL AND a IS NULL))
);
CREATE UNIQUE INDEX foo_acd_idx ON foo(a,c,d)
WHERE b is NULL;
CREATE UNIQUE INDEX foo_bcd_idx ON foo(b,c,d)
WHERE a is NULL;
INSERT INTO foo VALUES (NULL,2,3,4);
INSERT INTO foo VALUES (NULL,2,3,4); -- error!
私は、さらなる合併症を防ぐために、として宣言c
しました。d
NOT NULL
見る:
(1, NULL, 3, 4)
とを禁止するには、代わりに(NULL, 1, 3, 4)
1つのインデックスを使用できます。COALESCE
CREATE UNIQUE INDEX foo_xcd_idx ON foo(COALESCE(a,b),c,d);