我在 postgresql 9.3 資料庫中有一個表,其中列出了客戶和他們接受為布林值的支付型別。客戶可以接受多種支付型別,但他們必須至少接受一種支付型別。舉個例子:
表格格式:
--------- -------------- -------------- --------------
| clients | paymentType1 | paymentType2 | paymentType3 |
--------- -------------- -------------- --------------
| client1 | true | true | false |
| client2 | true | false | true |
| client3 | false | false | false |
--------- -------------- ----------------- -----------
客戶 1 和 2 有效,客戶 3 無效,因為他們沒有支付型別。有沒有辦法撰寫一個約束來強制執行這一點 - 以便對于任何行,這些 paymentType 布林值中的至少一個必須為真?
uj5u.com熱心網友回復:
您可以添加以下檢查約束:
ALTER TABLE yourTable
ADD CONSTRAINT payment_cnstr CHECK (
GREATEST(paymentType1, paymentType2, paymentType3) = true
);
僅當 3 列中的至少一列具有值時,上述GREATEST()函式才會回傳。truetrue
uj5u.com熱心網友回復:
只需在檢查約束中檢查它們中的任何一個是否為真:
alter table tablename
add constraint const_name check (paymentType1 or paymentType2 or paymentType3);
uj5u.com熱心網友回復:
PostgreSQL 檔案包含有關多列約束的完整資訊。
約束應該是:
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小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/430066.html
