1

鉴于:

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 回答 2

4

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

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

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

要使“检查”方法更可口,您可以添加“插入前”触发器。此触发器将交换值,因此a是最小的。

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

这些是一般规则。

然后,不同的数据库提供不同级别的功能。例如,Oracle 支持函数索引,因此您可以明确地在 a 和 b 中的最小值以及 a 和 b 中的最大值上拥有唯一索引——瞧,这正是您想要的约束。SQL Server 提供计算列,您可以保留这些列。您可以将它们包含在唯一约束中。

于 2013-05-31T22:37:17.227 回答
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

于 2013-05-31T22:48:02.897 回答