【发布时间】:2018-06-28 12:25:02
【问题描述】:
我正在尝试为两列的组合实现唯一约束。我正在运行 oracle 11g。
具体来说,我有两列 A 和 B。
我有如下一行
A B
1 2
那么我希望以下组合在插入时失败
A B
1 2
2 1
这可以通过 Oracle 中的唯一索引来实现吗?
【问题讨论】:
标签: sql database oracle oracle11g
我正在尝试为两列的组合实现唯一约束。我正在运行 oracle 11g。
具体来说,我有两列 A 和 B。
我有如下一行
A B
1 2
那么我希望以下组合在插入时失败
A B
1 2
2 1
这可以通过 Oracle 中的唯一索引来实现吗?
【问题讨论】:
标签: sql database oracle oracle11g
是的,有可能(例如使用生成的列):
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);
如果需要,您可以隐藏这些列(Oracle 12c):
ALTER TABLE tab MODIFY c1 INVISIBLE;
ALTER TABLE tab MODIFY c2 INVISIBLE;
更简单的方法:
CREATE UNIQUE INDEX UQ_tab ON tab(least(A,B), greatest(A,B));
【讨论】:
NULL,则此方法不起作用。
您可以将UNIQUE INDEX 与LEAST、GREATEST 和COALESCE 函数一起使用:
CREATE TABLE table_name (
a INT,
b INT
);
CREATE UNIQUE INDEX table_name__a__b__u ON TABLE_NAME(
COALESCE( LEAST( a, b ), a, b ),
GREATEST( a, b )
);
您需要包含COALESCE,以防其中一个值为NULL。
INSERT INTO table_name ( a, b ) VALUES ( 1, 2 );
1 rows affected
INSERT INTO table_name ( a, b ) VALUES ( 3, NULL );
1 rows affected
INSERT INTO table_name ( a, b ) VALUES ( 2, 1 );
ORA-00001: unique constraint (SCHEMA_NAME.TABLE_NAME__A__B__U) violated
INSERT INTO table_name ( a, b ) VALUES ( NULL, 3 );
ORA-00001: unique constraint (SCHEMA_NAME.TABLE_NAME__A__B__U) violated
【讨论】: