2015-03-29 3 views
0

Я просто хотел узнать, может ли кто-нибудь объяснить это.Почему MySQL вставляет пустые данные в непустые поля

Я просто тестировал свой код и не проверял пустые поля ввода (я знаю, что должен, но просто тестирование). В моей таблице базы данных все поля НЕ ЯВЛЯЮТСЯ, и я ожидал исключения потому что я ничего не вставлял .. Но получается, что MySQL вставляет все с пустыми значениями, также из MySQL workbench - то же самое.

Есть ли способ предотвратить это? (С точки зрения MySQL)

+0

Существуют ли значения по умолчанию для вашей схемы? –

+0

Нет, нет – user2430929

+0

Я уверен, что свойство MySQL не null просто указывает, что поле никогда не будет равно null, а не то, что оно не будет пустым. Обработка пустоты должна выполняться в конце приложения. – Ministry

ответ

2

Это поведение, хотя атипичные, довольно хорошо documented:

Вставка NULL в столбец, который был объявлен как NOT NULL. Для многострочных операторов INSERT или операторов INSERT INTO ... SELECT, столбец установлен на неявное значение по умолчанию для данных столбца . Это число 0 для числовых типов, пустая строка ('') для строк типов и «нулевое» значение для типов даты и времени. Операторы INSERT INTO ... SELECT обрабатываются так же, как многострочные вставки , потому что сервер не проверяет набор результатов из SELECT на , чтобы увидеть, возвращает ли он одну строку. (Для однорядной INSERT, не предупреждения не происходит, когда NULL вставляется в NOT NULL столбца. Вместо этого, утверждения завершается с ошибкой.)

Итак, если вы хотите получить сообщение об ошибке, используйте VALUES() с одним рядом. Альтернативно, определите триггер, который выполняет проверку.

Почему MySQL работает таким образом? Я не знаю, чтобы отличить себя от других баз данных и предотвратить ANSI-совместимость? Более серьезно, я предполагаю, что это вопрос эффективности и связан с тем, что MySQL не реализует ограничений check. Объявление NOT NULL является лишь примером ограничения проверки, и они не поддерживаются.

Смежные вопросы