Restricción NOT NULL sobre un set de columnas

Tengo una tabla en Postgres que actualmente tiene una restricción NOT NULL en su columna de email . Esta tabla también tiene una columna de phone que es opcional. Me gustaría que el sistema acepte algunos loggings sin email pero solo si tienen el phone como NOT NULL . En otras palabras, necesito una restricción de database NOT NULL que las consultas CREATE o UPDATE tengan éxito sin errores si uno o ambos campos de email o phone están presentes.

Ampliando lo anterior, ¿es posible en Postgres especificar un set de nombres de columna, uno o más de los cuales NOT NULL deberían ser NOT NULL para que el logging se actualice o cree correctamente?

@Igor tiene toda la razón y un par de expresiones OR 'son rápidas y simples.

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

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

Demostración SQL Fiddle .

¿Como funciona?

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

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

ROW es syntax networkingundante aquí.

Probar una expresión ROW con IS NULL solo informa TRUE si cada columna es NULL , que es exactamente lo que excluimos.

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 cambio, niegue 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) 

conseguiría lo mismo, less elegantemente y con una restricción importante: solo funciona para columnas de tipo de datos coincidentes , mientras que la comprobación de una expresión ROW funciona con cualquier columna.

Puede usar la restricción CHECK para esto. Algo como:

 CHECK (email is not null OR phone is not null) 

Los detalles sobre las restricciones se pueden encontrar here