Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Check constraint for a condition in Postgresql

I'm trying to create a check constraint to prevent people from changing a sales_status to 3 unless the progression_status is 80.

I thought it was

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

however this is returning an error saying that some row violates it. When I run the query

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

I get no results as expected. Yet I can't seem to make the check constraint to work

like image 411
Luffydude Avatar asked Oct 12 '25 17:10

Luffydude


1 Answers

Presumably, the error is because you have existing data that violates the constraint. So, check if this is true in existing data:

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

Note that this assumes that the columns are not null. (check constraints and where treat null booleans differently.)

EDIT:

I think the logic you want is:

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

Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!