首页 > 解决方案 > 非唯一约束

问题描述

所以,我遇到了这种情况:我创建了一个表(比如说model_a),在这个表中我有 2 个列(比如说col1col2)。我需要一个满足这一现实的约束:

model_a

col1 | col2
-----+-----
  1  |  1  //first row
  2  |  1  >> ok
  1  |  1  >> ok
  1  |  2  >> can not insert this row

这不是 UNIQUE 约束,您可以复制第一行。

该约束激活的唯一一次col1是相同但col2不同的。

需要帮助 :smile: 非常感谢!

标签: sqlpostgresqlconstraintsuniquecheck-constraints

解决方案


我正在考虑两列的最小/最大值的唯一索引,该索引仅适用于值不相等的行:

create unique index myidx 
    on model_a (least(col1, col2), greatest(col1, col2))
    where (col1 <> col2)

DB Fiddle 上的演示

insert into model_a (col1, col2) values (1, 1); -- ok
insert into model_a (col1, col2) values (2, 1); -- ok
insert into model_a (col1, col2) values (1, 1); -- ok

insert into model_a (col1, col2) values (1, 2);
-- ERROR:  duplicate key value violates unique constraint "myidx"
-- DETAIL:  Key (LEAST(col1, col2), GREATEST(col1, col2))=(1, 2) already exists.

推荐阅读