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

当前回答

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

Autoincrement不是postgresql。您希望始终生成一个整数主键作为标识(如果使用PG 9或更低,则生成一个串行主键。串行在PG 10中被轻度弃用)。

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

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

其他回答

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

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

Autoincrement不是postgresql。您希望始终生成一个整数主键作为标识(如果使用PG 9或更低,则生成一个串行主键。串行在PG 10中被轻度弃用)。

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

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

如果你像我一样,带着:

一个已经存在的表, 您需要向其添加一个新列 还需要在新列和旧列上添加一个新的唯一约束,即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

似乎是常规的UNIQUE约束:)

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

更多的在这里