我可以向多个布尔列添加约束,以便至少有一个必须为真吗?

Can I add a constraint to multiple boolean columns so that at least one must be true?

我在 postgresql 9.3 数据库中有一个 table,它列出了客户和他们接受的支付类型作为布尔值。客户可以接受多种支付类型,但他们必须接受至少一种支付类型。举个例子:

Table格式:

+---------+--------------+--------------+--------------+
| clients | paymentType1 | paymentType2 | paymentType3 | 
+---------+--------------+--------------+--------------+
| client1 | true         | true         | false        |
| client2 | true         | false        | true         |
| client3 | false        | false        | false        |
+---------+--------------+-----------------+-----------+

客户 1 和 2 有效,客户 3 无效,因为他们没有支付类型。有没有一种方法可以编写约束来强制执行此操作 - 以便对于任何行,这些 paymentType 布尔值中至少有一个必须为真?

您可以添加以下检查约束:

ALTER TABLE yourTable   
ADD CONSTRAINT payment_cnstr CHECK (
    GREATEST(paymentType1, paymentType2, paymentType3) = true
);

如果 3 列中至少有一个具有 true 值,则上面的 GREATEST() 函数将仅 return true

简单地检查它们是否在检查约束中为真:

alter table tablename   
add constraint const_name check (paymentType1 or paymentType2 or paymentType3);

PostgreSQL documentation 具有关于 multi-column 约束的完整信息。

约束应该是:

CREATE TABLE clients (
    client0 bool,
    client1 bool,
    client2 bool,
    CHECK((client0 OR client1 OR client2) = true)
);

insert into clients(client0,client1,client2)
values (true, true, false);

insert into clients(client0,client1,client2)
values (false, false, false);

第二次插入会失败。

db-fiddle