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 列值的索引中的唯一性,但失败,导致错误被标记。