我可以向多个布尔列添加约束,以便至少有一个必须为真吗?
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);
第二次插入会失败。
我在 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);
第二次插入会失败。