Postgres:一个布尔值真所有其他假检查约束?

zum*_*zum 4 sql postgresql

我正在使用 Postgres 并且我有一个包含几列布尔类型的表。c1,c2,c3,c4 是列 (BOOLEAN)。

在我的模型中,我必须有其中之一,并且只有一个设置为 true。其他三个一定是假的。

我在表的其他列上添加了类似的检查(针对 null,而不是 bool)案例,如下所示:

ADD CONSTRAINT only_one_name_not_null CHECK (num_nonnulls(n1, n2, n3, n4) = 1)
Run Code Online (Sandbox Code Playgroud)

我还没有找到做同样事情的解决方案,但使用布尔类型。

有没有办法强制一个布尔值为真,其他为假?

Gor*_*off 6

您可以转换为数字和计数:

check (( n1::int) + (n2::int) + (n3::int) + (n4::int) = 1)
Run Code Online (Sandbox Code Playgroud)

注意:这假设值不是NULL。如果NULL允许使用s,则可以使用类似的逻辑。他们大概会被视为虚假的。