根据值为Postgres表添加约束

时间:2016-05-18 21:35:18

标签: sql postgresql

我有以下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.如果不是这样的话,我想扔一个错误。

我该怎么做?

谢谢!

1 个答案:

答案 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模式,以便人们愿意(也许,希望......)认识到伪装的含义。