在 PostgreSQL 中,如果列“Art”(这绝不是 NULL)是 == 'Typ 3' 并且其他三个列全部为 NULL 或全部为 NOT NULL,我想要一个检查约束。 我的代码对于具有“类型 2”、NULL、NULL、NULL、NULL 的第一条记录失败。
ALTER TABLE "SandBox"."T Test" ADD CONSTRAINT "T Test_Serie_check" CHECK (
"Art" = 'Type 3' AND (
("ID-Serie_fkey" IS NULL AND "Type" IS NULL AND "Nr" IS NULL AND "NrTotal" IS NULL)
OR
("ID-Serie_fkey" IS NOT NULL AND "Type" IS NOT NULL AND "Nr" IS NOT NULL AND "NrTotal" IS NOT NULL)
)
);
如何解决这个问题?
在这种情况下,Postgres 提供了一对非常有用的函数:num_nulls() 和 num_nonnulls()。给定一个列列表,它们根据需要返回空或非空的列数。通过消除
case
结构,您的代码可能会更容易阅读。 (请参阅此处的演示)
constraint serie_check check ( art <> 'Type 3'
or art = 'Type 3' and
num_nulls (fkey, type, nrtotal) in (0,3)
)