我想在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。您需要integer primary key generated always as identity
(如果使用PG 9或更低版本,则需要serial
。serial
在PG 10中已被软弃用(。
如果col1
和col2
使一个唯一且不能为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));
更多此处