Ограничение NOT NULL для набора столбцов

У меня есть стол в Postgres, который в настоящее время имеет NOT NULL ограничение на это email колонка. Эта таблица также имеет phone столбец, который является необязательным. Я хотел бы, чтобы система принимала некоторые записи без email но только если они имеют phone как NOT NULL, Другими словами, мне нужен NOT NULL ограничение базы данных, так что CREATE или же UPDATE запросы выполняются без ошибок, если один или оба email или же phone поля присутствуют.

Расширяя вышеизложенное, можно ли в Postgres указать набор имен столбцов, одно или несколько из которых должны быть NOT NULL для записи, которая будет успешно обновлена ​​или создана?

2 ответа

Решение

@ Игорь совершенно прав и пара ORВыражение "ed" быстрое и простое.

Для длинного списка столбцов (a, b, c, d, e, f, g в примере) это короче и так же быстро:

CHECK (NOT (a,b,c,d,e,f,g) IS NULL)

SQL Fiddle demo.

Как это работает?

Более подробная форма вышеупомянутого была бы:

CHECK (NOT ROW(a,b,c,d,e,f,g) IS NULL)

ROW здесь избыточный синтаксис

Тестирование ROW выражение с IS NULL только отчеты TRUE если каждый столбец NULL - что именно то, что мы исключаем.

Невозможно просто обратить это выражение с (a,b,c,d,e,f,g) IS NOT NULLпотому что это будет проверять, что каждый столбец IS NOT NULL, Вместо этого отрицайте все выражение NOT, Вуаля.

Более подробная информация в руководстве здесь и здесь.

Выражение формы:

CHECK (COALESCE(a,b,c,d,e,f,g) IS NOT NULL)

будет достигать того же, менее элегантно и с серьезным ограничением: работает только для столбцов соответствующего типа данных, в то время как проверка на ROW Выражение работает с любыми столбцами.

Ты можешь использовать CHECK ограничение для этого. Что-то вроде:

CHECK (email is not null OR phone is not null)

Подробности об ограничениях можно найти here

Другие вопросы по тегам