auto_increment mysql sql mysql-error-1062

MySql no puede hacer la columna auto_increment



select auto_increment mysql (8)

Este error también ocurrirá si tiene una tabla MyISAM que tiene una PRIMARY KEY AUTO_INCREMENT compuesta y está tratando de combinar las claves

Por ejemplo

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`);

Tengo una tabla "Bestelling" con 4 columnas: "Id" (PK), "KlantId", "Datum", "BestellingsTypeId", ahora quiero hacer la columna Id auto_increment, sin embargo, cuando intento hacer eso, obtener este error:

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

Alguien tiene una idea?


Esto sucede cuando MySQL no puede determinar un valor auto_increment adecuado. En su caso, MySQL elige 1 como el siguiente valor de auto_increment, sin embargo, ya hay una fila con ese valor en la tabla.

Una forma de resolver el problema es elegir usted mismo un valor auto_increment adecuado:

ALTER TABLE ... CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 123456;

(Tenga en cuenta el AUTO_INCREMENT=123456 al final.)


Esto sucede porque la columna de clave principal ya tiene valores.

Como dice el error ...

ALTER TABLE provoca la resecuenciación de auto_increment, lo que da como resultado la entrada duplicada ''1'' para la clave ''PRIMARY''

lo que significa que su columna ya tiene un valor de clave principal 1 que cuando se auto_increment esa columna se reasigna causando duplicación y por lo tanto este error

La solución a esto es eliminar la restricción principal y luego vaciar la columna. A continuación, modifique la tabla configurando la clave principal nuevamente, esta vez con incremento automático.


Esto sucederá si la tabla contiene un registro existente con un id de 0 (o negativo). Actualizar todos los registros existentes para usar valores positivos permitirá que auto_increment se establezca en esa columna.

Editar: Algunas personas preguntaron cómo llegó ese 0 allí. Para aclarar, el Manual de referencia de MySQL indica que "Para los tipos numéricos, el valor predeterminado es 0, con la excepción de que para los tipos enteros o de punto flotante declarados con el atributo AUTO_INCREMENT, el valor predeterminado es el siguiente valor en la secuencia". Por lo tanto, si realizó una inserción en una tabla sin proporcionar un valor para la columna numérica antes de que se habilitara el autoincremento, entonces se usaría el 0 predeterminado durante la inserción. Se pueden encontrar más detalles en https://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html .


La forma más fácil que he encontrado para resolver este problema es establecer primero el valor de AUTO INCREMENT la tabla antes de modificar la columna. Solo asegúrese de establecer el valor de incremento automático más alto que el valor más grande actualmente en esa columna:

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

Probé esto en MySQL 5.7 y funcionó muy bien para mí.


También tuve este problema al intentar convertir una columna en auto_increment donde una fila tenía un valor de 0. Una alternativa a cambiar el valor de 0 temporalmente es a través de la configuración:

SET SESSION sql_mode=''NO_AUTO_VALUE_ON_ZERO'';

para la sesión.

Esto permitió que la columna se modificara a auto_increment con el ID de cero en su lugar.

El cero no es ideal, y tampoco recomendaría que se use en una columna auto_increment. Desafortunadamente es parte de un conjunto de datos heredado, así que estoy atascado con esto por ahora.

Lo mejor es borrar el ajuste (y cualquier otro) después con:

SET SESSION sql_mode='''';

aunque se borrará cuando la sesión del cliente actual clsoes.

Todos los detalles sobre la configuración ''NO_AUTO_VALUE_ON_ZERO'' here .


Tuve un problema similar. El problema era que la tabla tenía un registro con ID = 0 similar a lo que señalaba SystemParadox. Manejé mi problema siguiendo estos pasos:

Pasos:

  1. Actualizar el ID de registro 0 para que sea x donde x = MAX(id)+1
  2. Modificar la tabla para establecer la clave principal y la configuración de incremento automático
  3. Establezca el valor inicial en x+1
  4. Cambiar el ID de registro x nuevo a 0

Ejemplo de código:

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;


Edición : No sé exactamente cómo se causaría eso, pero tengo una solución.

Primero, crea una nueva tabla como la anterior:

CREATE TABLE aafest_bestelling_new LIKE aafest_bestelling;

Luego cambia la columna

ALTER TABLE `aafest`.`aafest_bestelling_new` CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT

Volcar en los nuevos datos:

INSERT INTO aafest_bestelling_new (KlantId, Datum, BestellingTypeId) SELECT KlantId, Datum, BestellingTypeId FROM aafest_bestelling;

Mueve las tablas:

RENAME TABLE aafest_bestelling TO aafest_bestelling_old, aafest_bestelling_new TO aafest_bestelling;

Tal vez hay algo de corrupción pasando, y esto arreglaría eso también.

PD: Como holandés, recomiendo encarecidamente la codificación en inglés;)