Gostaria de definir um tipo composto cujos campos são NOT NULL
; enquanto, ao mesmo tempo, permite que o valor em si esteja NULL
em uma coluna da tabela. Minha primeira tentativa foi definir um DOMAIN
no tipo composto com uma CHECK
restrição que assegurasse que os campos são NOT NULL
; infelizmente, isso impede NULL
que ele seja INSERT
ed na tabela:
BEGIN;
CREATE TYPE foo AS (x int, y int);
CREATE DOMAIN non_null_foo AS foo CHECK((VALUE).x IS NOT NULL AND (VALUE).y IS NOT NULL);
CREATE TABLE bar(y non_null_foo);
INSERT INTO bar VALUES (NULL);
ROLLBACK;
erros: ERROR: value for domain non_null_foo violates check constraint "non_null_foo_check"
.
Minha segunda tentativa foi permitir NULL
em VALUE
, DOMAIN
mas isso também não funciona, pois agora permite um valor onde todos os campos são NULL
:
BEGIN;
CREATE TYPE foo AS (x int, y int);
CREATE DOMAIN non_null_foo AS foo CHECK(VALUE IS NULL OR ((VALUE).x IS NOT NULL AND (VALUE).y IS NOT NULL));
CREATE TABLE bar(y non_null_foo);
INSERT INTO bar VALUES ((NULL, NULL)); --succeeds
INSERT INTO bar VALUES ((1, NULL)); --fails
ROLLBACK;
É como se o Postgresql não conseguisse distinguir entre NULL
e um valor onde todos os campos são NULL
. Há algo que eu esteja esquecendo?