Это поведение, хотя атипичные, довольно хорошо documented:
Вставка NULL в столбец, который был объявлен как NOT NULL. Для многострочных операторов INSERT
или операторов INSERT INTO ... SELECT
, столбец установлен на неявное значение по умолчанию для данных столбца . Это число 0 для числовых типов, пустая строка ('') для строк типов и «нулевое» значение для типов даты и времени. Операторы INSERT INTO ... SELECT
обрабатываются так же, как многострочные вставки , потому что сервер не проверяет набор результатов из SELECT на , чтобы увидеть, возвращает ли он одну строку. (Для однорядной INSERT
, не предупреждения не происходит, когда NULL вставляется в NOT NULL столбца. Вместо этого, утверждения завершается с ошибкой.)
Итак, если вы хотите получить сообщение об ошибке, используйте VALUES()
с одним рядом. Альтернативно, определите триггер, который выполняет проверку.
Почему MySQL работает таким образом? Я не знаю, чтобы отличить себя от других баз данных и предотвратить ANSI-совместимость? Более серьезно, я предполагаю, что это вопрос эффективности и связан с тем, что MySQL не реализует ограничений check
. Объявление NOT NULL
является лишь примером ограничения проверки, и они не поддерживаются.
Существуют ли значения по умолчанию для вашей схемы? –
Нет, нет – user2430929
Я уверен, что свойство MySQL не null просто указывает, что поле никогда не будет равно null, а не то, что оно не будет пустым. Обработка пустоты должна выполняться в конце приложения. – Ministry