Что произойдёт при INSERT, если явно передать NULL в столбец, для которого задано значение DEFAULT?
Явно переданный NULL не заменяется значением DEFAULT: в столбец записывается NULL, если это разрешено его ограничениями. Значение по умолчанию применяется, когда столбец не указан в INSERT или для него явно использовано ключевое слово DEFAULT.
Если столбец объявлен как NOT NULL, вставка с явным NULL завершится ошибкой. Это отличается от пропуска столбца: при пропуске СУБД сначала подставляет значение по умолчанию.
Механизм DEFAULT нужен, чтобы таблица могла самостоятельно заполнять предсказуемые значения, когда клиент их не передаёт. Это уменьшает дублирование логики в приложениях и упрощает добавление новых необязательных столбцов в существующую схему.
При этом SQL различает отсутствие значения и намеренную передачу NULL. Такое различие позволяет клиенту явно выразить: значение неизвестно или отсутствует, а не использовать автоматически заданный вариант.
Ошибка возникает, когда разработчик считает NULL сигналом для применения DEFAULT. Например, приложение может передавать NULL вместо статуса, ожидая получить значение new, но фактически сохранит NULL либо получит ошибку ограничения NOT NULL.
Неверное понимание приводит к некорректным фильтрам, неожиданным результатам агрегирования и сбоям при последующей обработке строк. Особенно важно учитывать это при массовых INSERT и при передаче необязательных полей из API.
DEFAULT применяется в двух случаях:
Явный NULL является обычным выражением вставки и не запускает механизм значения по умолчанию. Само значение DEFAULT может быть константой или выражением, например текущей датой; оно вычисляется по правилам конкретной СУБД и обычно отдельно для каждой вставляемой строки.
В результате для строк с идентификаторами 1 и 3 значение state будет new, а для строки 2 — NULL. Если добавить NOT NULL, вторая вставка завершится ошибкой, тогда как первая и третья останутся корректными.
DEFAULT не является универсальным механизмом исправления данных. Ограничения, триггеры, правила преобразования типов и особенности конкретной СУБД могут дополнительно влиять на итоговое значение, поэтому контракт вставки нужно согласовывать со схемой таблицы.
В сервисе создания задач поле state стало необязательным для старых клиентов. Рассматривались три варианта: подставлять new в каждом клиенте, передавать NULL и надеяться на DEFAULT, либо не включать поле в INSERT.
Первый вариант дублирует бизнес-логику и требует синхронных изменений клиентов. Второй неверен: NULL не активирует DEFAULT и может нарушить NOT NULL. Выбран третий вариант — новые клиенты не передают поле, а сервер для особых случаев использует DEFAULT явно.
Так схема остаётся источником значения по умолчанию, старые клиенты совместимы с ней, а намеренное отсутствие значения при необходимости можно передать отдельно и явно.
Ответ: Нет. Для SQL это явное значение NULL, а не отсутствие значения. DEFAULT сработает только при пропуске столбца или при явном указании DEFAULT.
Ответ: Вставка завершится ошибкой нарушения NOT NULL. DEFAULT не является резервной заменой для NULL: наличие значения по умолчанию не отменяет проверку ограничения и не преобразует переданный NULL.
Ответ: Для обычного столбца результат обычно одинаков: в обоих случаях используется его выражение DEFAULT. Различие важно на уровне формулировки INSERT: явный DEFAULT позволяет указать это намерение даже тогда, когда столбец включён в список вставки. Кроме того, поведение отдельных специальных столбцов и допустимость синтаксиса зависят от конкретной СУБД.