Đây là một thử nghiệm nhỏ mà tôi đã chạy trong cơ sở dữ liệu Oracle (10g). Ngoài sự thuận tiện của Oracle (Oracle), tôi không thể tìm ra lý do tại sao một số insertions được chấp nhận và những người khác bị từ chối.Làm cách nào để có thể hạn chế nhiều cột để ngăn trùng lặp, nhưng bỏ qua các giá trị rỗng?
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
Giả sử rằng nó làm cho tinh thần để thỉnh thoảng có một số hàng với một số cột giá trị không rõ, tôi có thể nghĩ đến hai trường hợp sử dụng có thể liên quan đến các bản sao ngăn chặn:
1. Tôi muốn từ chối bản sao, nhưng chấp nhận khi bất kỳ hạn chế giá trị của cột không xác định.
2. Tôi muốn từ chối các bản sao, ngay cả trong trường hợp giá trị của một cột bị hạn chế không xác định.
Rõ ràng Oracle thực hiện một cái gì đó khác nhau mặc dù:
3. Từ chối bản sao, nhưng chấp nhận (chỉ) khi tất cả giá trị cột hạn chế chưa được biết.
Tôi có thể nghĩ cách để sử dụng triển khai của Oracle để sử dụng trường hợp (2) - ví dụ, có giá trị đặc biệt cho "không xác định" và làm cho các cột không thể rỗng. Nhưng tôi không thể tìm ra cách để sử dụng trường hợp (1).
Nói cách khác, làm cách nào để làm cho Oracle hoạt động như thế này?
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
Ví dụ hoàn hảo về câu hỏi hay (cộng với câu hỏi tôi cần trả lời!) – orbfish