Nói một cách chính xác, một cột nullable duy nhất (hoặc tập hợp các cột) có thể là NULL (hoặc một bản ghi NULL) chỉ một lần, vì có cùng giá trị (và điều này bao gồm NULL) nhiều lần rõ ràng vi phạm ràng buộc duy nhất.
Tuy nhiên, điều đó không có nghĩa là khái niệm "cột nullable duy nhất" là hợp lệ; để thực sự triển khai nó trong bất kỳ cơ sở dữ liệu quan hệ nào, chúng ta chỉ cần lưu ý rằng loại cơ sở dữ liệu này được chuẩn hóa để hoạt động bình thường và việc chuẩn hóa thường bao gồm việc bổ sung một số bảng bổ sung (không phải thực thể) để thiết lập mối quan hệ giữa các thực thể .
Hãy làm một ví dụ cơ bản chỉ xem xét một "cột nullable duy nhất", thật dễ dàng để mở rộng nó thành nhiều cột như vậy.
Giả sử chúng ta thông tin được đại diện bởi một bảng như sau:
create table the_entity_incorrect
(
id integer,
uniqnull integer null, /* we want this to be "unique and nullable" */
primary key (id)
);
Chúng ta có thể làm điều đó bằng cách đặt uniqnull ra và thêm một bảng thứ hai để thiết lập mối quan hệ giữa các giá trị uniqnull và the_entity (thay vì có uniqnull "bên trong" the_entity):
create table the_entity
(
id integer,
primary key(id)
);
create table the_relation
(
the_entity_id integer not null,
uniqnull integer not null,
unique(the_entity_id),
unique(uniqnull),
/* primary key can be both or either of the_entity_id or uniqnull */
primary key (the_entity_id, uniqnull),
foreign key (the_entity_id) references the_entity(id)
);
Để liên kết giá trị uniqnull với một hàng trong_entity, chúng ta cũng cần thêm một hàng trong_tương quan.
Đối với các hàng trong the_entity không có giá trị uniqnull nào được liên kết (tức là đối với những hàng mà chúng ta đặt NULL trong the_entity_incorrect), chúng ta chỉ cần thêm một hàng trong the_relation.
Lưu ý rằng các giá trị cho uniqnull sẽ là duy nhất cho tất cả các mối tương quan và cũng lưu ý rằng đối với mỗi giá trị trong the_entity có thể có nhiều nhất một giá trị trong mối quan hệ, vì các khóa chính và khóa ngoại trên đó thực thi điều này.
Sau đó, nếu giá trị 5 cho uniqnull được liên kết với id the_entity là 3, chúng ta cần:
start transaction;
insert into the_entity (id) values (3);
insert into the_relation (the_entity_id, uniqnull) values (3, 5);
commit;
Và, nếu giá trị id là 10 cho the_entity không có đối chứng uniqnull, chúng tôi chỉ thực hiện:
start transaction;
insert into the_entity (id) values (10);
commit;
Để chuẩn hóa thông tin này và lấy dữ liệu mà bảng như the_entity_incorrect sẽ lưu giữ, chúng ta cần:
select
id, uniqnull
from
the_entity left outer join the_relation
on
the_entity.id = the_relation.the_entity_id
;
Toán tử "kết nối bên ngoài bên trái" đảm bảo tất cả các hàng từ the_entity sẽ xuất hiện trong kết quả, đặt NULL vào cột uniqnull khi không có cột phù hợp nào trong the_relation.
Hãy nhớ rằng, bất kỳ nỗ lực nào dành ra trong vài ngày (hoặc vài tuần hoặc vài tháng) để thiết kế một cơ sở dữ liệu được chuẩn hóa tốt (và các chế độ xem và thủ tục không chuẩn hóa tương ứng) sẽ giúp bạn tiết kiệm nhiều năm (hoặc nhiều thập kỷ) đau đớn và lãng phí tài nguyên.