sql >> Base de Datos >  >> RDS >> PostgreSQL

Restricción NOT NULL sobre un conjunto de columnas

@Igor tiene toda la razón y un par de OR 'ed expresión son rápidas y sencillas.

Para una larga lista de columnas (a , b , c , d , e , f , g en el ejemplo), esto es más corto e igual de rápido:

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

db<>violín aquí
Antiguo violín SQL.

¿Cómo funciona?

Una forma más detallada de lo anterior sería:

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

ROW es una sintaxis redundante aquí.

Probando una ROW expresión con IS NULL solo informa TRUE si todas las columnas es NULL - que resulta ser exactamente lo que queremos excluir.

No es posible simplemente invertir esta expresión con (a,b,c,d,e,f,g) IS NOT NULL , porque eso probaría que cada columna IS NOT NULL . En su lugar, niega toda la expresión con NOT . Voilá.

Más detalles en el manual aquí y aquí.

Una expresión de la forma:

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

lograría lo mismo, con menos elegancia y con una restricción importante:solo funciona para columnas de tipo de datos coincidentes , mientras que la verificación en una ROW expresión funciona con any columnas.