在Postgresql中,在两列的组合上强制唯一
我想在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
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