在Postgresql中,强制在两列的组合上唯一

Pea*_*oto 160 sql postgresql unique

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

例如:

CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT,
    col1 int NOT NULL,
    col2 int NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

所以,col1col2可以重复,但不能在同一时间.所以,这是允许的(不包括id)

1 1
1 2
2 1
2 2
Run Code Online (Sandbox Code Playgroud)

但不是这个:

1 1
1 2
1 1 -- would reject this insert for violating constraints
Run Code Online (Sandbox Code Playgroud)

Clo*_*eto 186

CREATE TABLE someTable (
    id serial primary key,
    col1 int NOT NULL,
    col2 int NOT NULL,
    unique (col1, col2)
)
Run Code Online (Sandbox Code Playgroud)

autoincrement不是postgresql.你想要一个serial.

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

CREATE TABLE someTable (
    col1 int NOT NULL,
    col2 int NOT NULL,
    primary key (col1, col2)
)
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这里唯一的主键建议,因为在这种情况下我们不允许NULL值.从PostgeSQL文档:"请注意,唯一约束本身不提供唯一标识符,因为它不排除空值.""https://www.postgresql.org/docs/8.1/static/ddl-constraints的.html#AEN2038 (5认同)
  • 在某些情况下,您可能希望将代理键用作主键而不是列的组合。特别是在对大数据量进行联接时提高性能。我亲自去过下面的UNIQUE CONSTRAINT解决方案。 (2认同)

dja*_*azz 136

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

ALTER TABLE someTable
ADD UNIQUE (col1, col2)
Run Code Online (Sandbox Code Playgroud)


Tim*_*kov 15

看起来像常规UNIQUE CONSTRAINT :)

CREATE TABLE example (
a integer,
b integer,
c integer,
UNIQUE (a, c));
Run Code Online (Sandbox Code Playgroud)

更多这里


Tay*_*ess 11

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

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

这是对我有用的方法,利用上述答案之一并对其进行扩展:

-- 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
Run Code Online (Sandbox Code Playgroud)