Назад | Перейти на главную страницу

Как заставить MySQL принимать 0 в качестве допустимого значения автоинкремента

Короче говоря, у меня есть файл 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 на этом