Если у вас есть данные, нарушающие ваши желаемые правила, вы все равно можете использовать ограничение CHECK
, как продемонстрировано с помощью закрепленного бита.Просто сделайте это NOT VALID
:
ALTER TABLE mytable ADD CONSTRAINT project_id_required_for_status_5_or_higher
CHECK project_id IS NOT NULL OR status < 5) <b>NOT VALID</b>;
Тогда ограничение применяется только к последующим вставкам и обновлениям.Существующие строки игнорируются.(Но любое новое обновление должно исправить нарушающие значения, иначе оно завершится неудачей.)
У вас также должно быть ограничение FOREIGN KEY
, обеспечивающее ссылочную целостность для project_id
,иначе ограничение можно легко обойти с помощью фиктивных значений.
Замечательный момент: ограничение CHECK
не только запрещает упомянутые вами обновления, но и вставляет с нарушающим состоянием.
Как только всеСтроки фиксируются в соответствии с новым правилом, вы можете VALIDATE
ограничение:
ALTER TABLE mytable VALIDATE CONSTRAINT project_id_required_for_status_5_or_higher;
Подробнее: