@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.