これは、Oracle データベース (10g) で実行した小さな実験です。(オラクルの)実装の利便性は別として、一部の挿入が受け入れられ、他の挿入が拒否される理由がわかりません。
create table sandbox(a number(10,0), b number(10,0));
create unique index sandbox_idx on sandbox(a,b);
insert into sandbox values (1,1); -- accepted
insert into sandbox values (1,2); -- accepted
insert into sandbox values (1,1); -- rejected
insert into sandbox values (1,null); -- accepted
insert into sandbox values (2,null); -- accepted
insert into sandbox values (1,null); -- rejected
insert into sandbox values (null,1); -- accepted
insert into sandbox values (null,2); -- accepted
insert into sandbox values (null,1); -- rejected
insert into sandbox values (null,null); -- accepted
insert into sandbox values (null,null); -- accepted
いくつかの列の値が不明な行が時々あることが理にかなっていると仮定すると、重複の防止に関連する 2 つの使用例が考え
られます。 1. 重複を拒否したいが、制約された列の値が不明な場合は受け入れたい
2. 制約された列の値が不明な場合でも、重複を拒否したい。
ただし、明らかに Oracle は別のものを実装してい
ます。
ユースケース (2) に到達するために Oracle の実装を利用する方法を考えることができます。しかし、ユースケース(1)に到達する方法がわかりません。
つまり、どうすれば Oracle をこのように動作させることができるでしょうか?
create table sandbox(a number(10,0), b number(10,0));
create unique index sandbox_idx on sandbox(a,b);
insert into sandbox values (1,1); -- accepted
insert into sandbox values (1,2); -- accepted
insert into sandbox values (1,1); -- rejected
insert into sandbox values (1,null); -- accepted
insert into sandbox values (2,null); -- accepted
insert into sandbox values (1,null); -- accepted
insert into sandbox values (null,1); -- accepted
insert into sandbox values (null,2); -- accepted
insert into sandbox values (null,1); -- accepted
insert into sandbox values (null,null); -- accepted
insert into sandbox values (null,null); -- accepted