在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
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(如果使用PG 9或更低版本,则需要serialserial在PG 10中已被软弃用(。

如果col1col2使一个唯一且不能为null,则它们构成一个好的主键:

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

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

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

如果你像我一样,带着降落在这里

  • 预先存在的表
  • 您需要向其中添加一个新列,以及
  • 还需要在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

看起来像常规的唯一约束:(

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

更多此处

最新更新