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

时间:2013-01-08 18:36:15

标签: sql postgresql unique

我想在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

4 个答案:

答案 0 :(得分:150)

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)
)

答案 1 :(得分:115)

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

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

答案 2 :(得分:13)

看起来像常规的UNIQUE CONSTRAINT:)

CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c));

更多here

答案 3 :(得分:3)

如果像我一样,您的登陆地点是:

  • 一个预先存在的表
  • 您需要在其中添加新列的
  • 还需要在 new 列上添加一个新的唯一约束,以及一个 old 约束,AND
  • 能够撤消所有操作(即向下迁移)

这是对我有用的方法,它利用上述答案之一并将其扩展:

-- up

ALTER TABLE myoldtable ADD COLUMN newcolumn TEXT;
ALTER TABLE myoldtable ADD CONSTRAINT myoldtable_oldcolumn_newcolumn_key UNIQUE (oldcolumn, newcolumn);

---

ALTER TABLE myoldtable DROP CONSTRAINT myoldtable_oldcolumn_newcolumn_key;
ALTER TABLE myoldtable DROP COLUMN newcolumn;

-- down