2009-07-17 4 views
60

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

ответ

74

Из ответа я получил here:

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

SET [GLOBAL|SESSION] sql_mode='NO_AUTO_VALUE_ON_ZERO' 

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

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

+12

Вы должны быть осторожны: 'sql_mode' представляет собой список флагов с разделителями-запятыми. Если вы выполните 'sql_mode = 'NO_AUTO_VALUE_ON_ZERO'', вы можете непреднамеренно отключить другие флаги – Kip

+0

Это решение в основном работало для меня, однако мой дамп также включал некоторые места, где он переопределял' 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', чтобы эти временные переопределения могли быть сброшены на –

19

Проверьте режим DB 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 page topic на этом

5

неудачу безопасный путь:

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 
  • Проверяет NO_AUTO_VALUE_ON_ZERO уже установлен в sql_mode
  • Добавляет sql_mode только если не пустые
  • Устанавливает сессии, я рекомендую использовать его только на сеансах, где вам нужно вставить 0
4

Если вы не хотите, чтобы калечить с MySQL переменными, вот полезный хак:

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; 

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

+6

Очевидно , он не работает, если вы используете целое число без знака. – fnkr

Смежные вопросы