Поведение вставки MySQL NOT NULL - PullRequest
0 голосов
/ 31 мая 2018

Я сейчас работаю с MySQL 5.5 и хочу обновить до 5.6 или 5.7.Однако я столкнулся со странным поведением (это может быть ошибка MySQL или некоторая глобальная переменная по умолчанию).Следующий код прекрасно работает с 5.5, но не работает с 5.6, 5.7.Так что либо у 5.5 есть проблема, либо я пропускаю некоторые настройки с 5.6 / 5.7.

create table null_test( not_null VARCHAR(255) NOT NULL);
insert into null_test values();

Как и следовало ожидать, следующее не работает.

insert into null_test values(NULL); 

Из-за некоторого раннего копания это может быть связано с РЕЖИМОМ SQL, особенно ER_NO_DEFAULT_FOR_FIELD.

https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-full

1 Ответ

0 голосов
/ 01 июня 2018

Это результат Режим строгого SQL , включенный по умолчанию в более новых версиях MySQL.

Когда строгий режим отключен, опуская значение для столбца, который объявлен NOT NULL и не имеет явного значения DEFAULT, выдает предупреждение и принимает автоматическое значение по умолчанию.Для VARCHAR это автоматическое значение по умолчанию - пустая строка.

Когда включен строгий режим, это условие вызывает ошибку, если вы не используете INSERT IGNORE.

Нет конкретного режима SQL, который простоконтролирует это поведение;если вы хотите отключить эту проверку, вам нужно полностью отключить строгий режим.Поскольку строгий режим может привести к другим несовместимостям (например, ONLY_FULL_GROUP_BY ошибки), это может быть наиболее целесообразным способом для вас выполнить миграцию.

Но если вы просто хотите справиться с этой конкретной ошибкой, лучшим решением будет объявить явное значение по умолчанию в схеме:

create table null_test(not_null VARCHAR(255) NOT NULL DEFAULT '');
...