277

我想在 PostgreSQL 中设置一个表,这样两列必须是唯一的。任何一个值都可以有多个值,只要没有两个共享两者。

例如:

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

所以,col1并且col2可以重复,但不能同时重复。所以,这将是允许的(不包括 id)

1 1
1 2
2 1
2 2

但不是这个:

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

4 回答 4

339
CREATE TABLE someTable (
    id serial PRIMARY KEY,
    col1 int NOT NULL,
    col2 int NOT NULL,
    UNIQUE (col1, col2)
)

autoincrement不是postgresql。你想要一个integer primary key generated always as identity(或者serial如果你使用 PG 9 或​​更低版本。 serial在 PG 10 中被软弃用)。

如果col1andcol2是唯一的并且不能为空,那么它们是一个很好的主键:

CREATE TABLE someTable (
    col1 int NOT NULL,
    col2 int NOT NULL,
    PRIMARY KEY (col1, col2)
)
于 2013-01-08T18:38:46.027 回答
220

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

ALTER TABLE someTable
ADD UNIQUE (col1, col2)
于 2013-01-08T18:42:57.620 回答
25

似乎是常规的 UNIQUE CONSTRAINT :)

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

更多在这里

于 2013-01-08T18:38:39.540 回答
18

如果像我一样,你来到这里:

  • 预先存在的表,
  • 您需要向其中添加新列,以及
  • 还需要在列和列上添加新的唯一约束,并且
  • 能够撤消这一切(即写下迁移)

这对我有用,利用上述答案之一并扩展它:

-- 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
于 2020-09-04T00:08:39.230 回答