Ограничение 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