PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Contrainte NOT NULL sur un ensemble de colonnes

@Igor a tout à fait raison et quelques OR 'ed expression sont rapides et simples.

Pour une longue liste de colonnes (a , b , c , d , e , f , g dans l'exemple), c'est plus court et tout aussi rapide :

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

db<>jouez ici
Ancien violon SQL.

Comment ça marche ?

Une forme plus détaillée de ce qui précède serait :

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

ROW est une syntaxe redondante ici.

Tester un ROW expression avec IS NULL uniquement rapporte TRUE si chaque colonne est NULL - qui se trouve être exactement ce que nous voulons exclure.

Il n'est pas possible d'inverser simplement cette expression avec (a,b,c,d,e,f,g) IS NOT NULL , car cela testerait que chaque colonne IS NOT NULL . Au lieu de cela, annulez l'expression entière avec NOT . Voilà.

Plus de détails dans le manuel ici et ici.

Une expression de la forme :

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

obtiendrait la même chose, moins élégamment et avec une restriction majeure :ne fonctionne que pour les colonnes de type de données correspondant , tandis que la vérification d'un ROW l'expression fonctionne avec tout colonnes.