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

UNIQUEMySQLは、設計上、インデックスを持つ列に複数のNULL値を許可します。

on MySQLは例外であり、UNIQUEインデックスが設定されているため、1つの列にBDB storage engine複数の値を含めることはできませんでした。NULL

一方、OracleはNULL値に関して異なる動作をしました。UNIQUEOracleで単一の列にインデックスを作成すると、基本的に不明な値NULLを意味するため、複数の値を持つことができます。したがって、2つのNULL値を相互に比較することはできません。それ以上、Oracleの場合、NULL値はインデックスに格納されません。つまり、Oracleで複数の列にインデックスを作成すると、2つの列があり、1つの列がです。1つの列にが含まれていても、同じ値の2つのレコードを挿入することはできません。NULLUNIQUENOT NULLNULLABLENULL

このことを考慮:

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 に答える