Pembaruan 21-09-17 :Mulai hari ini, gerardnll memberikan jawaban yang lebih baik (IMO terbaik) :
Untuk membantu orang menemukan solusi terbersih, saya sarankan Anda memberi upvote jawaban gerardnll .
(FYI, saya orang yang sama yang menanyakan pertanyaan awal.)
Ini jawaban asli saya dari tahun 2013
Berikut adalah solusi dua kolom yang elegan menurut "kendala -- satu atau kolom lainnya bukan null" papan pesan PostgreSQL :
ALTER TABLE my_table ADD CONSTRAINT my_constraint CHECK (
(column_1 IS NULL) != (column_2 IS NULL));
(Tetapi pendekatan di atas tidak dapat digeneralisasikan ke tiga kolom atau lebih.)
Jika Anda memiliki tiga kolom atau lebih, Anda dapat menggunakan pendekatan tabel kebenaran yang diilustrasikan oleh a_horse_with_no_name . Namun, saya menganggap yang berikut ini lebih mudah dirawat karena Anda tidak perlu mengetikkan kombinasi logis:
ALTER TABLE my_table
ADD CONSTRAINT my_constraint CHECK (
(CASE WHEN column_1 IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN column_2 IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN column_3 IS NULL THEN 0 ELSE 1 END) = 1;
Untuk memadatkan ini, akan berguna untuk membuat fungsi khusus sehingga CASE WHEN column_k IS NULL THEN 0 ELSE 1 END
boilerplate dapat dihapus, meninggalkan sesuatu seperti:
(non_null_count(column_1) +
non_null_count(column_2) +
non_null_count(column_3)) = 1
Itu mungkin sekompak yang diizinkan PSQL (?). Karena itu, saya lebih suka menggunakan sintaks semacam ini jika memungkinkan:
non_null_count(column_1, column_2, column_3) = 1