2011-11-03 17 views
8

Por lo tanto, cuando intenta agregar un autoincremento a un campo aparece # 1062 - Entrada duplicada '1' para la clave 1. He intentado quitar la clave principal y volver a agregarlo y que funciona bien (que supongo que no tendría si había duplicados?)# 1062 - Entrada duplicada '1' para la clave 1 - No se encontraron entradas duplicadas

Pero cuando intento agregar un incremento automático para el campo que genera un error. Me da una opción de exploración que se ejecuta el siguiente código SQL:

SELECT * 
FROM `myTbl` 
WHERE CONCAT_WS("-", 11) = "1" 
ORDER BY 11 
LIMIT 0 , 30 

Sin embargo, este devuelve un conjunto de resultados vacío .. lo que sugiere que no hay duplicados. Entonces, si no hay duplicados, ¿por qué no puedo agregar un autoincrement?

+0

¿Qué esperas que sea el resultado de 'CONCAT_WS (" - ", 11)'? Siempre consigo 11 allí ... – glglgl

+0

Por favor, publique el resultado de 'SHOW CREATE TABLE myTbl' y el comando que usa para agregar autoincrement. También tenga en cuenta que 'CONCAT_WS ('-', 11) = '1'' siempre evaluará a' FALSE'. No puede usar el ordinal del campo en la cláusula 'WHERE' como lo hace en' ORDER BY'. – Quassnoi

+0

Así que no creo que sea ditzy, no escribí ese SQL, fue generado por phpMyAdmin al presionar el botón Examinar después de que generó el error. Creo que el póster de abajo (Michael Mior) tiene razón y ahora estoy intentando esa solución. – Ashley

Respuesta

20

¿Tiene alguna fila con el valor 0 o NULL para esta columna? ALTER TABLE puede hacer que las claves primarias sean resecuenciadas. En el caso de una clave de 0, MySQL intentará darle el valor 1, que fallará si la clave 1 ya existe.

Intente cambiar cualquier 0 o NULL valores en la columna a algo más alto (y sin usar).

+0

@Micheal, lo que sucede si tratas de insertar un 0 en el PK depende del modo SQL en el que esté MySQL. Si está en el modo relajado old-skool, no sustituirá a 1, sino que dará el siguiente autoincremento. Si está en el modo estricto recomendado, insertará '0'. – Johan

+0

@Johan Buen punto. Sin embargo, todavía sospecho que esto resolverá el problema. –

+0

Esto funcionó - tenía un 0 allí; ¡Gracias! – Ashley

0
SELECT *       <<-- Select * is an anti-pattern 
FROM myTbl 
WHERE CONCAT_WS("-", 11) = "1" <<-- You are not selecting a column 
ORDER BY 11      <<-- This however does refer to a column. 
LIMIT 30 OFFSET 0 

reescribir la consulta a

SELECT field1, field2, field3, ...., field11 
FROM myTbl 
WHERE COALESCE(field1, field2, field3, field11) = '1' 
ORDER BY field11    
LIMIT 30 OFFSET 0 

Si desea insertar un código de uso consecutivo de esta manera:

INSERT INTO table1 (/*do not list the PK!*/ field2, field3, field4) 
    VALUES ('a', 'test' ,'b' ,'example'); 

Si desea seleccionar todas las filas duplicadas utilizan:

SELECT id, count(*) as duplicate_count 
FROM table1 
GROUP BY id 
HAVING duplicate_count > 1 

Deberá actualizar esos identificadores que están listados como duplicados.

Otra opción es agregar una columna adicional y soltar la PK anterior.

ALTER TABLE table1 ADD COLUMN new_id unsigned integer not null auto_increment primary key; 
ALTER TABLE table1 DROP COLUMN id; 
ALTER TABLE table1 CHANGE COLUMN newid id; 
+0

A menos que malinterprete, el problema es que el OP no puede agregar 'AUTO_INCREMENT' a una columna. No veo cómo esto resuelve el problema. –

2

La respuesta de Michael Mior funciona si puede cambiar los datos en la tabla. Sin embargo, también hay una solución alternativa que le permite mantener los datos intactos (lo he probado en MySQL 5.5). Recuerde que tener un valor cero como clave principal en MySQL no es una práctica recomendada solo por este motivo. Si puedes deshacerte del cero, hazlo.

desactivar la generación de valor automática cuando se inserta un cero:

SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO; 

Añadir AUTO_INCREMENT a su columna:

ALTER TABLE ... AUTO_INCREMENT; 

Vuelva a activar la generación automática de valor:

SET SQL_MODE=''; 

Debería Sea obvio que no se puede permitir la inserción de datos en la tabla durante toda esta operación. De lo contrario, habrá valores cero no deseados en la columna.

Cuestiones relacionadas