Oracle 数据库中的 null 是否等于 null?

我试图在 Oracle 中使用唯一索引强制每个客户端只使用一个活动电话,但无法使其正常工作。这在 PostgreSQL 和 DB2 中完美无缺,但在 Oracle 中似乎不起作用。

示例如下:

create table phone (
  client_id number(6) not null,active number(1) not null check (active in (0,1)),value varchar2(15)
);

insert into phone (client_id,active,value) values (10,'1111');
insert into phone (client_id,1,'3333');
insert into phone (client_id,value) values (15,'5555');
insert into phone (client_id,'6666');
insert into phone (client_id,'7777'); -- offending row

当我尝试创建索引时:

create unique index ix1 on phone (client_id,case when active = 1 then active end);

似乎Oracle不喜欢它,因为重复的索引条目:

错误:ORA-01452:无法创建唯一索引;发现重复键
SQLState: 72000

如果我删除有问题的数据行,则可以创建索引。

fatglen 回答:Oracle 数据库中的 null 是否等于 null?

您可以使用:

create unique index ix1 on phone (case active when 1 then client_id end);

sqlfiddle here

所有列都是UNIQUE时,NULL索引不会存储行;但是,在您的情况下,基于函数的索引导致两个值之一为 NULL,因此该行将被编入索引,这将导致索引中出现重复值。

更改它以便输出是从 activeclient_id 列派生的单个值意味着 active = 0 将导致 NULL 输出的行CASE 表达式和那些行将不会包含在索引中,只会检查活动行是否存在重复项。

来自 Oracle Unique constraint documentation

为了满足唯一约束,表中的任何两行都不能具有相同的唯一键值。但是,由单个列组成的唯一键可以包含空值。为了满足复合唯一键,表或视图中的任何两行都不能在键列中具有相同的值组合。在所有键列中包含空值的任何行自动满足约束。但是,包含一个或多个键列的空值以及其他键列的相同值组合的两行违反了约束。

本文链接:https://www.f2er.com/9489.html

大家都在问