MySql не может сделать столбец auto_increment - PullRequest
39 голосов
/ 23 марта 2011

У меня есть таблица «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

Кто-нибудь получил идею?

Ответы [ 9 ]

126 голосов
/ 24 июня 2011

Это произойдет, если таблица содержит существующую запись с идентификатором 0 (или отрицательным). Обновление всех существующих записей для использования положительных значений позволит установить auto_increment для этого столбца.

Редактировать: Некоторые люди спрашивали, как этот 0 попал туда. Для пояснения в Справочном руководстве MySQL говорится, что «Для числовых типов значением по умолчанию является 0, за исключением того, что для целочисленных типов или типов с плавающей точкой, объявленных с атрибутом AUTO_INCREMENT, значением по умолчанию является следующее значение в последовательности». Таким образом, если вы выполнили вставку в таблицу без указания значения для числового столбца до того, как auto_increment был включен, то при вставке будет использоваться значение по умолчанию 0. Более подробную информацию можно найти на https://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html.

36 голосов
/ 28 февраля 2012

У меня также была эта проблема при попытке преобразовать столбец в 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» здесь .

14 голосов
/ 11 декабря 2014

Это происходит, когда 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 в конце.)

13 голосов
/ 23 марта 2011

Редактировать : Не знаю точно, как это может быть вызвано, но у меня есть обходной путь.

Сначала создайте новую таблицу, подобную старой:

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: Как голландец, я очень рекомендую кодирование на английском языке;)

8 голосов
/ 25 апреля 2016

Самый простой способ, который я нашел, чтобы решить эту проблему, это сначала установить значение AUTO INCREMENT таблицы перед изменением столбца.Просто убедитесь, что вы установили значение автоинкремента выше, чем наибольшее значение в данный момент в этом столбце:

ALTER TABLE `aafest`.`aafest_bestelling` 
AUTO_INCREMENT = 100, 
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT

Я проверил это на MySQL 5.7, и он отлично работал для меня.

2 голосов
/ 11 апреля 2018

У меня была похожая проблема.Проблема заключалась в том, что в таблице была запись с ID = 0, аналогичная той, на которую указывал SystemParadox.Я обработал свою проблему следующим образом:

Шаги:

  1. Обновление идентификатора записи 0, чтобы оно было x, где x = MAX(id)+1
  2. Измените таблицу для установки первичного ключа и настройки автоматического приращения
  3. Установите начальное значение равным x+1
  4. Измените идентификатор записи 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;
2 голосов
/ 03 апреля 2014

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

Как говорит ошибка ...

ALTER TABLE вызывает повторное упорядочение auto_increment, что приводит к дублированию записи «1» для ключа «PRIMARY»

, что означает, что у вашего столбца уже есть значение первичного ключа 1 , которое при автоматическом увеличении этого столбца переназначается, вызывая дублирование и, следовательно, эту ошибку

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

0 голосов
/ 03 июля 2019

Если таблица является относительно новой с несколькими записями, вы можете обрезать таблицу для сброса значений идентификатора:

TRUNCATE TABLE tablename;

Использование Delete не приведет к сбросу значений ID.

DELETE FROM tablename;

после опустошения таблицы вы можете применить автоинкремент.

CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT
0 голосов
/ 10 марта 2014

Эта ошибка также произойдет, если иметь таблицу MyISAM, которая имеет составной AUTO_INCREMENT PRIMARY KEY и пытается объединить ключи

Например

CREATE TABLE test1 (
 `id` int(11) NOT NULL,
 `ver` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`,`ver`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO test1 (`id`, `ver`) VALUES (1,NULL),(1,NULL),(1,NULL), (2,NULL),(2,NULL),(2,NULL);

ALTER TABLE test1 DROP PRIMARY KEY, ADD PRIMARY KEY(`ver`);
...