列唯一性可以交换吗?

use*_*760 4 postgresql constraint unique-constraint

我在 Postgres 数据库中有一个表,其中col1col2是指同一列的外键。我只想要 的唯一组合(col1, col2),即如果(1,2)输入则(2,1)应该被拒绝。我怎样才能做到这一点?

我的表定义:

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

Dan*_*ité 7

可以使用此唯一索引强制执行此唯一性约束:

CREATE UNIQUE INDEX idxname ON mytable(least(col1,col2),greatest(col1,col2));
Run Code Online (Sandbox Code Playgroud)

演示:

test=> 插入到 mytable (col1,col2) values(1,2);
插入 0 1
test=> 插入到 mytable (col1,col2) values(2,1);
错误:重复键值违反唯一约束“idxname”
详细信息:键 ((LEAST(col1, col2)), (GREATEST(col1, col2)))=(1, 2) 已经存在。