如何检查多个字段的唯一性但在 postgres 中单独检查?
How to check uniqueness of multiple fields but checked individually in postgres?
我有一种情况,我需要组合多个字段来检查唯一性,但需要单独检查唯一性。例如,
- (A, 1) - 应该通过并成功插入
- (B, 2) - 应该通过并成功插入
- (B, 1) - 应该会失败,因为已经有一个 '1'
- (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
我有一种情况,我需要组合多个字段来检查唯一性,但需要单独检查唯一性。例如,
- (A, 1) - 应该通过并成功插入
- (B, 2) - 应该通过并成功插入
- (B, 1) - 应该会失败,因为已经有一个 '1'
- (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