Почему я могу установить NULL в колонку mark, если у меня есть CHECK(mark in (1,2,3))?
Разве он не должен выдавать ошибку, ведь mark = NULL, не является mark IN (1,2,3)?
ALTER TABLE progress
ADD CHECK(
(test_form = 'Test' AND mark in (1,2,3))
OR
(test_form = 'Exam' AND mark in (4,5))
);
UPDATE progress
SET test_form = 'Exam', mark = NULL;
Нет, не должен. Значение NULL не противоречит такому check constraint. На самом деле даже в исходниках самого postgresql есть замечания, что такое поведение несколько неожиданно, но таков стандарт SQL.