Короче говоря, у меня есть файл SQL, который я хочу импортировать в качестве файла стиля skel
, так что это будет сделано повторно, программно. Я могу редактировать файл SQL, но я хочу, но я бы не стал касаться самого приложения.Как заставить MySQL принимать 0 в качестве действительного значения автоинкремента
Это приложение использует 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
в этой области?
Вы должны быть осторожны: 'sql_mode' представляет собой список флагов с разделителями-запятыми. Если вы выполните 'sql_mode = 'NO_AUTO_VALUE_ON_ZERO'', вы можете непреднамеренно отключить другие флаги – Kip
Это решение в основном работало для меня, однако мой дамп также включал некоторые места, где он переопределял' sql_mode' в середине sql-файла, а затем перезагрузив переменную 'OLD_SQL_MODE', которая была настроена на возврат в конец скрипта. Это было переопределение моего «NO_AUTO_VALUE_ON_ZERO» в середине моего скрипта, что не помогло. Мое решение состояло в том, чтобы создать новую переменную 'INIT_OLD_SQL_MODE', которую я использовал для сброса в конце, и после того, как я установил' sql_mode' в 'NO_AUTO_VALUE_ON_ZERO', я установил новую переменную' OLD_SQL_MODE', чтобы эти временные переопределения могли быть сброшены на –