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

Короче говоря, у меня есть файл SQL, который я хочу импортировать какskel файл стиля, так что это будет сделано многократно, программно. Я могу редактировать файл 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 в этой области?

Ответы на вопрос(4)

INSERT INTO `{{TABLE_PREFIX}}users` VALUES (-1, '', '', '', 0, 0, 0, '', '', 0, 0, 0, 0, 0, NULL, '', '', '', NULL);

А потом

UPDATE `{{TABLE_PREFIX}}users` SET id = 0 where id = -1;

Очевидно, это предполагает, что вы используете целое число со знаком и не используете отрицательные значения для идентификаторов вашей таблицы.

 24 февр. 2016 г., 16:33
Очевидно, что это не сработает, если вы используете целое число без знака.

SET @@session.sql_mode = 
    CASE WHEN @@session.sql_mode NOT LIKE '%NO_AUTO_VALUE_ON_ZERO%' 
        THEN CASE WHEN LENGTH(@@session.sql_mode)>0
            THEN CONCAT_WS(',',@@session.sql_mode,'NO_AUTO_VALUE_ON_ZERO')  -- added, wasn't empty
            ELSE 'NO_AUTO_VALUE_ON_ZERO'                                    -- replaced, was empty
        END
        ELSE @@session.sql_mode                                             -- unchanged, already had NO_AUTO_VALUE_ON_ZERO set
    END
Checks if NO_AUTO_VALUE_ON_ZERO already set in sql_mode Adds to sql_mode if not empty Sets only the session, I recommend using it only on the sessions where you need to insert a 0

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 на этом

Update

Для MariaDB используйте команду, указанную вэтот комментарий

SET sql_mode='NO_AUTO_VALUE_ON_ZERO'
 25 апр. 2018 г., 13:18
@ hiddeneyes02 Это пост за 2010 год, спасибо за замечание, я обновлю ответ :)
 24 апр. 2018 г., 19:34
Это не работает на MariaDB, я должен был использовать это:SET sql_mode='NO_AUTO_VALUE_ON_ZERO'
Решение Вопроса

From the answer I got Вот:

Ты можешь использовать:

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO'

Который, как описаноВот, не позволит MySQL интерпретировать идентификатор INSERT / UPDATE, равный 0, как следующий идентификатор последовательности. Такое поведение будет ограничено значением NULL.

Это то, что я считаю довольно плохим поведением приложения. Вы должны быть очень осторожны, чтобы он использовался последовательно, особенно если вы решите внедрить репликацию на более позднем этапе.

 03 июн. 2016 г., 23:36
Это решение в основном работало для меня, однако мой дамп также включал некоторые места, где он переопределял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 что эти временные переопределения могут быть сброшены до
 14 мая 2014 г., 16:55
Вы должны быть осторожны с одной вещью:sql_mode список флагов, разделенных запятыми Если вы делаетеsql_mode='NO_AUTO_VALUE_ON_ZERO'вы можете случайно отключить другие флаги

Ваш ответ на вопрос