在Postgresql中,对两个列的组合强制惟一

我想在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
179314 次浏览

似乎是常规的UNIQUE约束:)

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

更多在这里

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中被轻度弃用)。

如果col1col2是唯一且不能为空的,则它们是一个很好的主键:

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

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

ALTER TABLE someTable
ADD UNIQUE (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