2011-03-23 29 views
27

Tengo una tabla "Bestelling" con 4 columnas: "Id" (PK), "KlantId", "Datum", "BestellingsTypeId", ahora quiero hacer que la columna Id auto_increment, sin embargo, cuando trato de hacerlo, obtengo este error:MySql no puede hacer la columna 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 

¿Alguien tiene una idea?

Respuesta

13

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

En primer lugar, crear una nueva tabla como la anterior:

CREATE TABLE aafest_bestelling_new LIKE aafest_bestelling; 

a continuación, cambiar la columna

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

volcado en los nuevos datos:

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

mover las mesas:

RENAME TABLE 
aafest_bestelling TO aafest_bestelling_old, 
aafest_bestelling_new TO aafest_bestelling; 

Quizás haya algo de corrupción, y esto arreglaría eso también.

P.S .: Como holandés, lo recomiendo mucho la codificación en Inglés;)

+0

ye, pero la columna ya es PK, por lo que todos los valores deben ser únicos, ¿no? –

+0

Eche un vistazo .. Tuve mis tablas de MySQL más de una vez en un estado donde se violaron las restricciones de exclusividad. SELECT Id, COUNT (*) como recuento de aafest_bestelling GROUP BY Id TENIENDO count> 1; – Evert

+0

devuelve 0 registros ... –

97

Esto sucederá si la tabla contiene un registro existente con un id de 0 (o negativo). La actualización de 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í. Como aclaración, el Manual de referencia de MySQL establece 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 auto_increment, entonces el valor predeterminado 0 se usaría durante la inserción. Se pueden encontrar más detalles en https://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html.

+4

y luego puede volver a cambiar el id a 0 si quiere – Niels

+2

No lo recomiendo. Sospecho que podría causar problemas nuevamente más tarde – SystemParadox

+1

Este fue exactamente mi problema. Ahora, ¿cómo entró ese 0 allí ... – Frungi

28

También tuve este problema al intentar convertir una columna a auto_increment donde una fila tenía un valor de 0. Una alternativa para cambiar el valor 0 por ajuste temporal es:

SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO'; 

para la sesión.

Esto permitió alterar la columna a auto_increment con la identificación cero en su lugar.

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

mejor para eliminar la configuración (y cualquier otro) después con:

SET SESSION sql_mode=''; 

aunque se borra cuando el clsoes sesión actual del cliente.

Detalles completos sobre la configuración 'NO_AUTO_VALUE_ON_ZERO' here.

+2

Desde mi punto de vista, este es el enfoque más sencillo para los datos ya existentes que contienen ceros en las columnas PK. ¡Lo aprecio mucho, ahorré mucho de mi tiempo! – sharpener

+0

Esto debería tener más votaciones ascendentes que hace. –

+0

Yo también tenía un conjunto de datos heredado con una ID de 0. Para esos casos, y sospecho que la persona que hizo la pregunta tenía el mismo caso de uso, esta es la respuesta correcta. –

0

Este error también ocurrirá si tiene una tabla MyISAM que tiene un compuesto AUTO_INCREMENTPRIMARY KEY y están tratando de combinar las teclas

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

Esto sucede porque la columna de clave primaria ya tiene los valores .

Como dice el error ...

ALTER TABLE provoca resecuenciación AUTO_INCREMENT, lo que resulta en entrada duplicada '1' para la tecla 'primaria'

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

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

8

Esto ocurre 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 un valor AUTO_INCREMENT adecuada a sí mismo: (. Tenga en cuenta la AUTO_INCREMENT=123456 al final)

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

+0

Exactamente lo que necesitaba. No puedo creer que esta respuesta no sea más alta en la lista. –

6

La manera más fácil que he encontrado para resolver este problema es establecer primero el valor AUTO INCREMENT de la tabla antes de alterar la columna. Sólo asegúrese de que se establece el valor de auto incremento mayor 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 

He probado esto en MySQL 5.7 y funcionó muy bien para mí.

+0

Genio, gracias. Me hubiera sacado el pelo. – cdonner

+0

¡Esto debe seleccionarse como la respuesta correcta, no el método de recreación de la tabla! –

Cuestiones relacionadas