MySql не может сделать столбец auto_increment
У меня есть таблица "Bestelling" с 4 столбцами: "Id" (PK), "KlantId", "Datum", "BestellingsTypeId", теперь я хочу сделать Id столбца auto_increment, однако, когда я пытаюсь это сделать, я получите эту ошибку:
ERROR 1062: ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1' for key 'PRIMARY'
SQL Statement:
ALTER TABLE `aafest`.`aafest_bestelling` CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT
ERROR: Error when running failback script. Details follow.
ERROR 1046: No database selected
SQL Statement:
CREATE TABLE `aafest_bestelling` (
`Id` int(11) NOT NULL,
`KlantId` int(11) DEFAULT NULL,
`Datum` date DEFAULT NULL,
`BestellingstypeId` int(11) DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
У кого-нибудь есть идея?
10 ответов
Это произойдет, если таблица содержит существующую запись с идентификатором 0 (или отрицательным). Обновление всех существующих записей для использования положительных значений позволит установить auto_increment в этом столбце.
Изменить: Некоторые люди спрашивали, как этот 0 попал туда. Для пояснения в Справочном руководстве MySQL говорится, что "Для числовых типов значением по умолчанию является 0, за исключением того, что для целочисленных типов или типов с плавающей точкой, объявленных с атрибутом AUTO_INCREMENT, значением по умолчанию является следующее значение в последовательности". Таким образом, если вы выполнили вставку в таблицу, не указав значение для числового столбца до того, как auto_increment был включен, во время вставки будет использоваться значение по умолчанию 0. Более подробную информацию можно найти по адресу https://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html.
У меня также была эта проблема при попытке преобразовать столбец в auto_increment, где одна строка имела значение 0. Альтернативой временному изменению значения 0 является установка:
SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';
для сессии.
Это позволило изменить столбец на auto_increment с нулевым идентификатором.
Ноль не идеален - и я бы также не рекомендовал использовать его в столбце auto_increment. К сожалению, это часть унаследованного набора данных, поэтому я застрял с ним на данный момент.
Лучше всего очистить настройки (и любые другие) впоследствии с помощью:
SET SESSION sql_mode='';
хотя он будет очищен, когда текущий клиентский сеанс прекратится.
Полная информация о настройке "NO_AUTO_VALUE_ON_ZERO" здесь.
Это происходит, когда MySQL не может определить правильное значение auto_increment. В вашем случае MySQL выберет 1
в качестве следующего значения auto_increment, однако в таблице уже есть строка с этим значением.
Один из способов решения этой проблемы - выбрать правильное значение auto_increment самостоятельно:
ALTER TABLE ... CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 123456;
(Обратите внимание AUTO_INCREMENT=123456
в конце.)
Самый простой способ, который я нашел, чтобы решить эту проблему, это сначала установить таблицу AUTO INCREMENT
значение до изменения столбца. Просто убедитесь, что вы установили значение автоинкремента выше, чем наибольшее значение в этом столбце:
ALTER TABLE `aafest`.`aafest_bestelling`
AUTO_INCREMENT = 100,
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT
Я проверил это на MySQL 5.7, и он отлично работал для меня.
Изменить: Не знаю точно, как это будет вызвано, но у меня есть обходной путь.
Сначала создайте новую таблицу, подобную старой:
CREATE TABLE aafest_bestelling_new LIKE aafest_bestelling;
Затем измените столбец
ALTER TABLE `aafest`.`aafest_bestelling_new`
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT
Дамп в новые данные:
INSERT INTO aafest_bestelling_new
(KlantId, Datum, BestellingTypeId)
SELECT
KlantId, Datum, BestellingTypeId
FROM aafest_bestelling;
Переместить столы:
RENAME TABLE
aafest_bestelling TO aafest_bestelling_old,
aafest_bestelling_new TO aafest_bestelling;
Может быть, происходит какая-то коррупция, и это тоже исправит это.
PS: как голландец, я очень рекомендую писать по-английски;)
У меня была похожая проблема. Проблема в том, что в таблице была запись с ID = 0
похоже на то, что указал SystemParadox. Я справился с проблемой следующим образом:
шаги:
- Обновить идентификатор записи 0, чтобы быть
x
гдеx = MAX(id)+1
- Изменить таблицу, чтобы установить первичный ключ и настройку автоматического приращения
- Установите начальное значение как
x+1
- Изменить идентификатор записи
x
вернуться к0
Пример кода:
UPDATE foo SET id = 100 WHERE id = 0;
ALTER TABLE foo MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE foo AUTO_INCREMENT = 101;
UPDATE foo SET id = 0 WHERE id = 100;
Эта ошибка возникает из-за того, что любая таблица содержит существующую запись с идентификатором 0 (или отрицательным). Обновление всех существующих записей для использования положительных значений позволит установить auto_increment для этого столбца. Если это не сработало, экспортируйте все данные и сохраните их в любом месте на вашем компьютере и не создавайте сначала отношения внешнего ключа, а затем заполните данные в родительской таблице.
Это происходит потому, что ваш столбец первичного ключа уже имеет значения.
Как говорит ошибка...
ALTER TABLE вызывает повторное упорядочение auto_increment, что приводит к дублированию записи "1" для ключа "PRIMARY"
это означает, что у вашего столбца уже есть значение первичного ключа 1, которое, когда вы auto_increment, этот столбец переназначается, вызывая дублирование и, следовательно, эту ошибку
Решение этой проблемы состоит в том, чтобы удалить основное ограничение и затем очистить столбец. Затем измените таблицу, задав первичный ключ снова, на этот раз с автоматическим приращением.
Эта ошибка также произойдет, если таблица MyISAM имеет составную AUTO_INCREMENT
PRIMARY KEY
и пытаемся совместить ключи
Например
CREATE TABLE test1 ( `id` int(11) NOT NULL, `ver` int(10) без знака NOT NULL AUTO_INCREMENT, ПЕРВИЧНЫЙ КЛЮЧ (`id`,`ver`)) ENGINE=MySAM CHARSET ПО УМОЛЧАНИЮ =utf8; INSERT INTO test1 (`id`, `ver`) ЗНАЧЕНИЯ (1,NULL),(1,NULL),(1,NULL), (2,NULL),(2,NULL),(2,NULL); ALTER TABLE test1 DROP PRIMARY KEY, ADD PRIMARY KEY(`ver`);
Невозможность установить для существующего столбца значение auto_increment также возникает, если столбец, который вы пытаетесь изменить, включен в отношение внешнего ключа в другой таблице (хотя это не приведет к появлению сообщения об ошибке, упомянутого в вопросе).
(Я добавляю этот ответ, хотя он не относится к конкретному сообщению об ошибке в теле вопроса, потому что это первый результат, который появляется в Google при поиске проблем, связанных с невозможностью установить существующий MySQL столбец в auto_increment.)