PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Vincolo NOT NULL su un insieme di colonne

@Igor ha ragione e un paio di OR 'ed expression sono veloci e semplici.

Per un lungo elenco di colonne (a , b , c , d , e , f , g nell'esempio), questo è più breve e altrettanto veloce:

CHECK (NOT (a,b,c,d,e,f,g) IS NULL)

db<>gioca qui
Old SQL Fiddle.

Come funziona?

Una forma più dettagliata di quanto sopra sarebbe:

CHECK (NOT ROW(a,b,c,d,e,f,g) IS NULL)

ROW è ridondante la sintassi qui.

Testare una ROW espressione con IS NULL solo segnala TRUE se ogni singola colonna è NULL - che è esattamente ciò che vogliamo escludere.

Non è possibile semplicemente invertire questa espressione con (a,b,c,d,e,f,g) IS NOT NULL , perché ciò verificherebbe che ogni singola colonna IS NOT NULL . Invece, nega l'intera espressione con NOT . Voilà.

Maggiori dettagli nel manuale qui e qui.

Un'espressione della forma:

CHECK (COALESCE(a,b,c,d,e,f,g) IS NOT NULL)

otterrebbe lo stesso risultato, in modo meno elegante e con una limitazione importante:funziona solo per colonne di tipo di dati corrispondente , mentre il controllo su una ROW l'espressione funziona con qualsiasi colonne.