1

我需要基于四列对表创建一个限制,其中两个是互斥的,我的意思是,如果一个是 NULL,另一个不是。

理想的脚本是这样的:

ALTER TABLE ONLY t_users_prizes
ADD CONSTRAINT t_user_prize_test_circuit_key
UNIQUE (id_event||':'||id_circuit, id_prize, id_user);

但是 Postgres 不允许这种连接。

如何实施此限制?

4

1 回答 1

9

NULL值不违反UNIQUE约束 - 两个NULL不被视为相等!所以一个简单的UNIQUE约束是行不通的。

您可以使用两个部分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! 

我宣布cand das NOT NULL,以防止进一步的并发症。

看:

要同时禁止(1, NULL, 3, 4)and (NULL, 1, 3, 4),您可以使用一个索引 withCOALESCE来代替:

CREATE UNIQUE INDEX foo_xcd_idx ON foo(COALESCE(a,b),c,d);
于 2013-01-19T12:01:52.333 回答