UNIQUE CONSTRAINT:执行唯一列表或列集

时间:2013-05-31 22:18:45

标签: sql unique-constraint

假设:

create table list(a bigint not null, b bigint not null);
insert into list(a, b) values(1, 1);
insert into list(a, b) values(1, 2);
insert into list(a, b) values(2, 1);
insert into list(a, b) values(1, 2);

如何实施以下约束?

  1. 防止重复的值列表。示例:(1,2)与(1,2)冲突。
  2. 防止重复的值集。示例:(1,2)与(2,1)冲突。
  3. SQL UNIQUE约束是否适用于值列表(订单重要)或一组值(忽略顺序)?
  4. 更新:我正在寻找与数据库无关的答案。如果不可能,则可以接受特定于数据库的答案。

    伙计们,如果你回答这个问题,请发表答案。评论仅供提问有关问题的问题。

2 个答案:

答案 0 :(得分:4)

第三个问题很简单,“是”。唯一性基于列的排序(问题中的值列表)。

列出的第一个项目可以由唯一约束(或等价的唯一索引)处理。

您可以使用技巧处理第二项,这在许多数据库中都可用。检查约束可以验证a< b。结合起来,这将保证(1)和(2)。

为了使“check”方法更加可口,您可以添加“before insert”触发器。此触发器将交换值,因此a是最小的。

您还可以检查触发器中的条件(尽管触发器的语法在数据库之间有所不同)。

这些是一般规则。

然后,不同的数据库提供不同级别的功能。例如,Oracle支持功能索引,因此您可以明确地在a和b的最小值以及a和b的最大值上显示唯一索引,这是一个完全符合您需要的约束。 SQL Server提供了可以保留的计算列。您可以将这些包含在唯一约束中。

答案 1 :(得分:2)

根据您的DBMS,您可以创建一个如下所示的唯一索引:

create unique index idx_ab on list(greatest(a,b), least(a,b));

(如果我没有弄错的话,这应该至少适用于Postgres,Oracle和DB2)

SQLFiddle示例:http://sqlfiddle.com/#!12/5add4/1