PostgreSQL:基于另一列的 CheckConstraint

问题描述 投票:0回答:1

在 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)
)
);

如何解决这个问题?

postgresql check-constraints
1个回答
0
投票

在这种情况下,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) 
                             )
© www.soinside.com 2019 - 2024. All rights reserved.