我想在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分(如果你使用第9页或更低的serial was soft-deprecated in PG 10分,则为serial分).

如果col1col2是唯一的,不能为空,那么它们就是一个好的主键:

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

Sql相关问答推荐

Snowflake SQL比较克隆x原始计数

将有界时间周期作为阶跃函数,其中周期开始返回1,周期结束返回0

如何用3个(半)固定位置建模团队,并有效地搜索相同/不同的团队?

如何从JSON数组中 Select 多个值

SQL子查询返回多个值错误

如何计算给定日期前三个月的值以及月初数据?

如何为缺少的类别添加行

SQL将三个表中的三列组合为一列

SQL仅返回第一个字母在A-Z之间的值

group-by-clause具有特定列,而不是oracle的toad中的all

为什么左联接结果在MS Access数据库中不匹配

SQL OR子句如何在JOINON查询中工作?

如何创建snowflake表(动态查找数据类型)并从阶段加载(AWS S3)?

Athena 计算从日期到当前时间戳的每月计数

如何在 postgres 中旋转某些数据字段

每个ID的SQL返回可能的最低级别及其值

PostgreSQL分割字符串为子词并判断其是否存在于其他字符串中

如何根据与 BigQuery 中另一个表的匹配更新一个表中的列?

Postgres:表的累积视图

从每行中排除最大元素