在Postgresql中,在两列组合上强制唯一


187

我想在PostgreSQL中建立一个表,使得两列在一起必须是唯一的。只要没有两个共享这两个值,就可以有多个值。

例如:

CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT,
    col1 int NOT NULL,
    col2 int NOT NULL
)

所以,col1col2可以重复,但不能在同一时间。因此,这将被允许(不包括ID)

1 1
1 2
2 1
2 2

但不是这个:

1 1
1 2
1 1 -- would reject this insert for violating constraints

由于这是在谷歌顶级排名的搜索结果,也许更好的提供ALTER存在表太
ϻαϻɾΣɀО-MaMrEzO

Answers:


224
CREATE TABLE someTable (
    id serial primary key,
    col1 int NOT NULL,
    col2 int NOT NULL,
    unique (col1, col2)
)

autoincrement不是postgresql。你想要一个serial

如果col1和col2唯一且不能为null,则它们将成为一个很好的主键:

CREATE TABLE someTable (
    col1 int NOT NULL,
    col2 int NOT NULL,
    primary key (col1, col2)
)

5
我喜欢这里建议使用主键而不是唯一键,因为在这种情况下我们不允许使用NULL值。来自PostgeSQL文档:“请注意,唯一约束本身并不提供唯一标识符,因为它不排除空值。)” postgresql.org/docs/8.1/static/ddl-constraints.html#AEN2038
ndequeker

如何在架构定义中实现呢?
wagng

2
在某些情况下,您可能希望将代理键用作主键而不是列的组合。特别是在对大数据量进行联接时提高性能。我亲自去过下面的UNIQUE CONSTRAINT解决方案。
Alexis.Rolland

1
是否可以仅对一个排列实施唯一约束,例如unique(col1,col2 ='1')?
Vikram Khemlani


160

创建两个数字不能一起重复的唯一约束:

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.