SQL 標準では、UNIQUE 制約の一部である列に複数の NULL 値が許可されていることを理解しています。
私が理解していないのは、UNION コンストラクト (少なくとも PostgreSQL では) が NULL 値を同じものとして扱う理由です。例えば:
$ select * from tmp_a;
a | b
---+---
a | b
a |
|
(3 rows)
$ select * from tmp_b;
a | b
---+---
a | c
a |
|
(3 rows)
$ select a, b from tmp_a union select a, b from tmp_b order by 1, 2;
a | b
---+---
a | b
a | c
a |
|
(4 rows)