Короче говоря, у меня есть файл SQL, который я хочу импортировать как skel
style, поэтому это будет повторяться программно. Я могу редактировать файл SQL, как хочу, но я бы не стал трогать само приложение.
Это приложение использует userid = 0
для представления анонимного пользователя. Он также имеет соответствующую (пустую) запись в базе данных для представления этого «пользователя». Следовательно, строка в моем skel.sql
выглядит примерно так:
INSERT INTO `{{TABLE_PREFIX}}users` VALUES (0, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL);
Проблема в том, что uid
это auto_increment
поле, для которого технически 0
недопустимое значение. Или, по крайней мере, если вы установите его в 0, вы в основном говорите MySQL: «Пожалуйста, вставьте следующий идентификатор в это поле».
Теперь, я полагаю, я мог бы поставить INSERT
затем UPDATE
запрос в мой файл SQL, но есть ли способ сообщить MySQL в целом, что да, я действительно хочу вставить 0
в это поле?
Ты можешь использовать:
SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'
Который, как описано Вот, не позволит MySQL интерпретировать идентификатор INSERT / UPDATE, равный 0, как идентификатор следующей последовательности. Такое поведение будет ограничено значением NULL.
Однако это то, что я считаю довольно плохим поведением приложения. Вам нужно быть очень осторожным, чтобы он использовался последовательно, особенно если вы решите реализовать репликацию позже.
Проверьте свой режим базы данных sql с помощью:
SELECT @@[GLOBAL|SESSION].sql_mode;
Если он пуст или не установлен, используйте:
SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'
БЫТЬ ОСТОРОЖЕН! Если вы используете GLOBAL
, это не немедленное изменение, вам необходимо перезапустить соединение, чтобы применить настройку.
Итак, если вы, например, восстанавливаете данные из одной БД в другую и не уверены, применяется ли этот параметр, используйте SESSION
для немедленного изменения (сбрасывается при закрытии соединения). Когда закончите, вставьте значение 0, и оно не изменится, даже если sql_mode
изменено.
Для сброса этого режима (и других) используйте
SET [GLOBAL|SESSION] sql_mode=''
Не рекомендуется использовать нулевые значения автоинкремента, потому что они не установлены по умолчанию в базах данных mysql.
Для получения дополнительной информации проверьте Тема страницы mysql dev на этом