UNIQUE
MySQLは、設計上、インデックスを持つ列に複数のNULL値を許可します。
on MySQLは例外であり、UNIQUEインデックスが設定されているため、1つの列にBDB storage engine
複数の値を含めることはできませんでした。NULL
一方、OracleはNULL
値に関して異なる動作をしました。UNIQUE
Oracleで単一の列にインデックスを作成すると、基本的に不明な値NULL
を意味するため、複数の値を持つことができます。したがって、2つのNULL値を相互に比較することはできません。それ以上、Oracleの場合、NULL値はインデックスに格納されません。つまり、Oracleで複数の列にインデックスを作成すると、2つの列があり、1つの列がです。1つの列にが含まれていても、同じ値の2つのレコードを挿入することはできません。NULL
UNIQUE
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列の値をインデックスの一意性と比較しようとしますが、失敗し、エラーのフラグが立てられます。