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

在Postgresql中,在两列的组合上强制唯一,sql,postgresql,unique,Sql,Postgresql,Unique,我想在PostgreSQL中设置一个表,这样两个列一起必须是唯一的。任何一个值都可以有多个值,只要没有两个值同时共享 例如: CREATE TABLE someTable ( id int PRIMARY KEY AUTOINCREMENT, col1 int NOT NULL, col2 int NOT NULL ) 因此,col1和col2可以重复,但不能同时重复。因此,这是允许的(不包括id) 但不是这个: 1 1 1 2 1 1 -- would reject

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

例如:

CREATE TABLE someTable (
    id int PRIMARY KEY AUTOINCREMENT,
    col1 int NOT NULL,
    col2 int NOT NULL
)
因此,
col1
col2
可以重复,但不能同时重复。因此,这是允许的(不包括id)

但不是这个:

1 1
1 2
1 1 -- would reject this insert for violating constraints

似乎是常规的唯一约束:)

更多

autoincrement
不是postgresql。您需要一个
序列号

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

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

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

ALTER TABLE someTable
ADD UNIQUE (col1, col2)

如果,像我一样,你带着:

  • 一个预先存在的表
  • 您需要向其中添加新列,以及
  • 还需要在新列和旧列上添加新的唯一约束,以及
  • 能够全部撤销(即写下迁移)
以下是对我有效的方法,利用上述答案之一并加以扩展:

-- 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的建议,因为在这种情况下我们不允许空值。PostgeSQL文档中写道:“请注意,唯一约束本身并不提供唯一标识符,因为它不排除空值。)“我如何在架构定义中实现这一点?在某些情况下,您可能希望将代理键用作主键,而不是列的组合。特别是在大数据量上执行连接时,可以提高性能。我个人选择了下面的唯一约束解决方案。是否可以仅对一个排列强制唯一约束,例如UNIQUE(col1,col2='1')?postgres:sql server:这是否独立地为
a
添加索引和
c
添加索引?因为我有时需要基于
a
快速查找,有时需要基于
c
快速查找。因为这是谷歌的顶级搜索结果,也许最好也提供alter exist表
CREATE TABLE someTable (
    col1 int NOT NULL,
    col2 int NOT NULL,
    PRIMARY KEY (col1, col2)
)
ALTER TABLE someTable
ADD UNIQUE (col1, col2)
-- 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