我有以下Postgres表
column_a | column_b |
---------+-----------+
001 | 1 |
004 | 2 |
006 | 3 |
007 | 4 |
008 | 5 |
104 | 0 |
204 | 0 |
我想在这个表中添加一个约束,这样每当(RIGHT(column_a, 1) = '4' OR column_a = '006') AND column_a <> '004'
column_b
的值需要等于0.如果不是这样的话,我想扔一个错误。
我该怎么做?
谢谢!
答案 0 :(得分:1)
你几乎已经得到了答案,你只需要将逻辑重新排列成一个可以放入CHECK约束的表达式。
您有P -> Q
形式的陈述,其中->
是合乎逻辑的含义。但从基本逻辑来看,我们知道:
(P -> Q) <-> (-P | Q)
将它应用于您的暗示并转换为SQL,我们得到SQL表达式:
NOT ((RIGHT(column_a, 1) = '4' OR column_a = '006') AND column_a <> '004') OR (column_b = 0)
然后将其包裹在CHECK中:
alter table your_table
add constraint whatever_you_want_to_call_it
check (
not ((right(column_a, 1) = '4' or column_a = '006') and column_a <> '004')
or (column_b = 0)
)
如果您愿意,可以使用De Morgan定律将not
移到第一个括号内的表达式中,或者您可以将其留在外面以突出显示-P | Q
模式,以便人们愿意(也许,希望......)认识到伪装的含义。