PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Kendala Postgres memastikan satu kolom dari banyak ada?

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql_insert_id alternatif untuk postgresql

  2. Liquibase/PostgreSQL:bagaimana cara mempertahankan case tabel dengan benar?

  3. Pembaruan ke bidang JSON tidak bertahan ke DB

  4. Menghubungkan postgresql dengan sqlalchemy

  5. Kembalikan nilai kolom pra-PERBARUI menggunakan SQL saja