两列任意组合的唯一约束

bha*_*don 3 sql database oracle oracle11g

我正在尝试为两列的组合实现唯一约束.我正在运行oracle 11g.

具体来说,我有两列A和B.

我有一排如下

A     B
1     2
Run Code Online (Sandbox Code Playgroud)

然后我希望插入时以下组合失败

A     B
1     2
2     1
Run Code Online (Sandbox Code Playgroud)

这可能是通过Oracle中的唯一索引实现的吗?

Luk*_*zda 6

是的,它是可能的(例如使用生成的列):

CREATE TABLE tab(A INT NOT NULL, B INT NOT NULL);

ALTER TABLE tab ADD c1 AS (LEAST(A,B));
ALTER TABLE tab ADD c2 AS (GREATEST(A,B));
CREATE UNIQUE INDEX UQ_tab ON tab(c1,c2);
Run Code Online (Sandbox Code Playgroud)

如果需要,您可以隐藏这些列(Oracle 12c):

ALTER TABLE tab MODIFY c1 INVISIBLE;
ALTER TABLE tab MODIFY c2 INVISIBLE;
Run Code Online (Sandbox Code Playgroud)

DBFiddle演示

编辑:

更简单的方法:

CREATE UNIQUE INDEX UQ_tab ON tab(least(A,B), greatest(A,B));
Run Code Online (Sandbox Code Playgroud)

DBFiddle演示