在Postgresql中检查条件约束

时间:2019-02-01 11:03:11

标签: sql postgresql check-constraints

我正在尝试创建检查约束,以防止人们将sales_status更改为3,除非progression_status80

我以为是

ALTER TABLE mytable 
   ADD CONSTRAINT sales_status_cant_be_3_for_nonprogressed 
   CHECK (((sales_status = 3 ) or (progression_status < 80)))

但是,这将返回错误,指出某行违反了它。当我运行查询

select * from mytable where sales_status = 3 and progression_status < 80

我没有得到预期的结果。但是我似乎无法使检查约束起作用

1 个答案:

答案 0 :(得分:2)

大概是因为您有违反约束的现有数据。因此,请检查现有数据是否为真:

select t.*
from mytable t
where not ( (sales_status = 3 ) or (progression_status < 80) );

请注意,这假定列不是null。 ({check约束和wherenull布尔值的处理不同。)

编辑:

我认为您想要的逻辑是:

CHECK ((sales_status <> 3 ) or (progression_status >= 80));