2

这个简单的脚本:

create table test (a integer not null, b integer, c integer not null);
create unique index test1 on test (a, b, c);
insert into test values(1, null, 1);
insert into test values(1, null, 1);
select * from test;

使用 MySQL 成功运行,使用 Oracle 失败并出现 ORA-0001“违反唯一约束”。

我不确定标准对多个空列上的唯一索引有何规定,但 MySQL 的行为可能与 Oracle 类似。

另见http://lists.mysql.com/mysql/183630

亚历山大。

4

1 回答 1

1

MySQL 在设计上允许在具有UNIQUE索引的列中有多个 NULL 值。

MySQL 上的BDB storage engine是一个例外,它不允许在一列中有多个NULL值,并且在其上具有 UNIQUE 索引。

另一方面,Oracle 在NULL价值观方面表现不同。当您在 Oracle 中的单个列上创建UNIQUE索引时,它将允许您拥有多个NULL值,因为NULL基本上意味着Unknown value,因此两个 NULL 值不能相互比较。不仅如此,在 Oracle 的情况下,NULL 值不会存储在 Index 中。这意味着,当您UNIQUE在 Oracle 中的多列上创建索引时,其中两列是NOT NULL,一列是NULLABLE,即使一列包含 ,它也不允许您插入具有相同值的两条记录NULL

考虑一下:

CREATE TABLE test (a NUMBER NOT NULL,
                   b NUMBER,
                   c NUMBER NOT NULL
                  );

INSERT INTO test VALUES (1, NULL, 1);
1 rows inserted.

INSERT INTO test VALUES (1, NULL, 1);

SQL Error: ORA-00001: unique constraint (RQ4151.UQ_TEST) violated
00001. 00000 -  "unique constraint (%s.%s) violated"
*Cause:    An UPDATE or INSERT statement attempted to insert a duplicate key.
           For Trusted Oracle configured in DBMS MAC mode, you may see
           this message if a duplicate entry exists at a different level.
*Action:   Either remove the unique restriction or do not insert the key.

发生这种情况是因为 Oracle 未在索引中存储 NULL 值,因此尝试比较 NOT NULL 列值的索引中的唯一性,但失败,导致错误被标记。

于 2013-02-20T06:37:33.530 回答