我想定义一个复合类型,其字段为NOT NULL
;同时允许值本身位于NULL
表列中。我的第一个尝试是DOMAIN
在复合类型上定义一个,并设置一个CHECK
约束,以确保字段为NOT NULL
;不幸的是,这会阻止NULL
其自身被放入INSERT
表中:
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;
错误:ERROR: value for domain non_null_foo violates check constraint "non_null_foo_check"
。
我的第二次尝试是允许NULL
在VALUE
中DOMAIN
,但这也不起作用,因为它现在允许所有字段都是的值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;
就好像 Postgresql 无法区分NULL
所有字段都是的值NULL
。我是不是漏掉了什么?