当前位置: 首页 > 面试题库 >

如何在Oracle中创建唯一索引但忽略空值?

韦原
2023-03-14
问题内容

我正在尝试在表中的两个字段上创建唯一约束。但是,很可能一个人将为空。我只要求如果它们都不为null(name永远不会为null),则它们必须是唯一的。

create unique index "name_and_email" on user(name, email);

忽略表和字段名称的语义以及这是否有意义-我刚刚做了一些补充。

有没有一种方法可以在这些字段上创建唯一约束,从而对两个非null值强制执行唯一性,但是如果有多个条目name(非null和null),email则可以忽略呢?

这个问题是针对SQL Server的,我希望答案不尽相同:
如何创建也允许空值的唯一约束?


问题答案:

我们可以使用基于函数的索引来做到这一点。NVL2()如您所知,以下内容将利用其中的一个:如果表达式不为null,则返回一个值;如果表达式为null,则返回另一个值。您可以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, 'apc@example.com')
  2  /

1 row created.

SQL> insert into blah values (null, 'apc@example.com')
  2  /

1 row created.

SQL> insert into blah values ('APC', 'apc@example.com')
  2  /

1 row created.

SQL> insert into blah values ('APC', 'apc@example.com')
  2  /
insert into blah values ('APC', 'apc@example.com')
*
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>


 类似资料:
  • 在MongoDB3.2中有可能避免这种情况吗?

  • 我构建了一个REST服务,发现使用Gson从ObjectId生成的JSON字符串的格式与Spring-Boot生成的格式不同。如果我以GSON格式将现有文档的_id字段的ObjectId发送到REST服务,并使用MongoRepository的save函数将其保存到集合中,即使在这样的字段上设置了唯一的索引,仍会插入具有duplicated_id的新文档。但是,如果我以spring-boot生成的

  • 问题内容: 这是具有3列(ID,UNIQUE_VALUE,UNIQUE_GROUP_ID)的示例表 我希望下面的记录可以被允许: 或者 或( 注:这种情况是不允许的,也不) 并且这些是不允许的: 我在最后2列上创建了唯一索引,但是仅允许前2个示例。 仅当两者都不为null时,才可以让db检查这两列的唯一性吗? 问题答案: 您只想对和都不为空的行实施唯一性。为此,您可以使用基于函数的唯一索引:

  • CreateIndexes 根据struct中的tag来创建索引 CreateUniques 根据struct中的tag来创建唯一索引

  • 问题内容: 不知道在PostgreSQL 9.3+中是否可行,但是我想在非唯一列上创建唯一索引。对于像这样的表: 我想仅能[快速]查询不同的日子。我知道我可以用来帮助执行不同的搜索,但是如果不同值的数量大大少于索引覆盖的行数,这似乎会增加额外的开销。就我而言,大约30天中有1天与众不同。 我是创建关系表以仅跟踪唯一条目的唯一选择吗?思维: 并在每次插入数据时使用触发器来更新它。 问题答案: 索引只

  • 问题内容: 哪个选项更好,更快?在空表上创建索引后插入数据,或在插入数据后创建唯一索引。我大约有1000万行要插入。哪种选择更好,这样我可以减少停机时间。 问题答案: 首先插入数据,然后创建索引。 每次执行UPDATE,INSERT或DELETE操作时,表上的所有索引也必须更新。因此,如果先创建索引,然后插入1000万行,则索引也必须更新1000万次(除非您要进行批量操作)。