Подтвердить что ты не робот

MySql не может сделать столбец auto_increment

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

У кого-нибудь появилась идея?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

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;

Возможно, происходит некоторая коррупция, и это также исправит это.

P.S.: Как голландец, я настоятельно рекомендую кодирование на английском языке;)

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

Ответ 7

У меня была похожая проблема. Проблема заключалась в том, что в таблице была запись с 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;

Ответ 8

Эта ошибка также произойдет, если таблица 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`);

Ответ 9

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

TRUNCATE TABLE tablename;

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

DELETE FROM tablename;

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

CHANGE COLUMN 'Id' 'Id' INT(11) NOT NULL AUTO_INCREMENT