如何在Oracle中创建唯一索引但忽略空值?
问题描述:
我想创建一个表中的两个字段的唯一约束。但是,很有可能一个将是空的。我只要求它们是唯一的,如果两者都不为空(name
永远不会为空)。如何在Oracle中创建唯一索引但忽略空值?
create unique index "name_and_email" on user(name, email);
忽略表和字段名称的语义以及是否有意义 - 我只是做了一些。
有没有一种方法来创建这些领域,将强制唯一两个没有空值的唯一约束,而忽略如果有多个条目,其中name
不是null email
为空?
这个问题是SQL Server,和我希望答案是不一样的: How do I create a unique constraint that also allows nulls?
答
我们可以用一个基于函数的索引做到这一点。如您所知,以下使用NVL2()
,如果表达式不为空,则返回一个值,如果为空,则返回不同的值。您可以改用CASE()
。
SQL> create table blah (name varchar2(10), email varchar2(20))
2/
Table created.
SQL> create unique index blah_uidx on blah
2 (nvl2(email, name, null), nvl2(name, email, null))
3/
Index created.
SQL> insert into blah values ('APC', null)
2/
1 row created.
SQL> insert into blah values ('APC', null)
2/
1 row created.
SQL> insert into blah values (null, '[email protected]')
2/
1 row created.
SQL> insert into blah values (null, '[email protected]')
2/
1 row created.
SQL> insert into blah values ('APC', '[email protected]')
2/
1 row created.
SQL> insert into blah values ('APC', '[email protected]')
2/
insert into blah values ('APC', '[email protected]')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.BLAH_UIDX) violated
SQL>
编辑
因为在你的方案名称将永远被组装你只需要一个这样的指标:
SQL> create unique index blah_uidx on blah
2 (nvl2(email, name, null), email)
3/
Index created.
SQL>
+1,FBI救援;-) – DCookie 2009-09-03 17:25:14
谢谢男人,赞美你! – 2014-08-05 09:14:59