如何检查多个字段的唯一性但在 postgres 中单独检查?

How to check uniqueness of multiple fields but checked individually in postgres?

我有一种情况,我需要组合多个字段来检查唯一性,但需要单独检查唯一性。例如,

  1. (A, 1) - 应该通过并成功插入
  2. (B, 2) - 应该通过并成功插入
  3. (B, 1) - 应该会失败,因为已经有一个 '1'
  4. (A, 2) - 应该会失败,因为已经有一个 '2'

为两个字段设置唯一性不会禁止插入 (3) 和 (4),因为唯一性检查这两个字段。我不能将这两个字段作为主键,因为我有一个丰富的模式并且已经有一个唯一的 UUID 作为主键。

您需要两个 UNIQUE 约束,每列一个。

与主键不同,您可以对 table 设置多个唯一约束。要获得与主键相同的行为,请设置列 NOT NULL.

正如我在评论中提到的,为您的列添加单独的唯一约束,例如

数据样本:

CREATE TABLE t 
(c1 TEXT UNIQUE, 
 c2 INT  UNIQUE);

这些插入将起作用。

INSERT INTO t VALUES ('A',1),('B',2);

INSERT 0 2

..这些都会失败

INSERT INTO t VALUES ('B',1);

ERROR:  duplicate key value violates unique constraint "t_c1_key"
DETAIL:  Key (c1)=(B) already exists.

INSERT INTO t VALUES ('A',2);

ERROR:  duplicate key value violates unique constraint "t_c1_key"
DETAIL:  Key (c1)=(A) already exists.

演示:db<>fiddle