tipos primary from for error entry duplicate mysql primary-key mysql-error-1062 duplicates

primary - Error de entrada duplicada de MySQL aunque no haya entrada duplicada



select*from table (14)

Acabo de intentarlo y, si tiene datos y la recreación de la tabla no funcionaría, simplemente modifique la tabla a InnoDB y vuelva a intentarlo, solucionaría el problema.

Estoy usando MySQL 5.1.56, MyISAM. Mi mesa se ve así:

CREATE TABLE IF NOT EXISTS `my_table` ( `number` int(11) NOT NULL, `name` varchar(50) NOT NULL, `money` int(11) NOT NULL, PRIMARY KEY (`number`,`name`) ) ENGINE=MyISAM;

Contiene estas dos filas:

INSERT INTO `my_table` (`number`, `name`, `money`) VALUES (1, ''S. Name'', 150), (2, ''Another Name'', 284);

Ahora estoy tratando de insertar otra fila:

INSERT INTO `my_table` (`number`, `name`, `money`) VALUES (2, ''S. Name'', 240);

Y MySQL simplemente no lo insertará mientras me dice esto:

#1062 - Duplicate entry ''2-S. Name'' for key ''PRIMARY''

Realmente no lo entiendo. La clave principal está en las dos primeras columnas (ambas), por lo que la fila que estoy tratando de insertar TIENE una clave principal única, ¿no es así?

Traté de reparar la mesa, traté de optimizar la mesa, todo fue en vano. También tenga en cuenta que no puedo cambiar de MyISAM a InnoDB.

¿Me estoy perdiendo algo o es un error de MySQL o MyISAM? Gracias.

Para resumir y señalar dónde creo que está el problema (aunque no debería haberlo): la tabla tiene la clave principal en dos columnas. Estoy tratando de insertar una fila con una nueva combinación de valores en estas dos columnas, pero el valor en la columna uno ya está en alguna fila y el valor en la columna dos ya está en otra fila. Pero no están combinados en cualquier lugar, así que creo que se supone que esto funciona y estoy muy confundido al ver que no funciona.


Casos menos comunes, pero tenga en cuenta que de acuerdo con DOC https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl-limitations.html

Al ejecutar una operación en línea ALTER TABLE, el subproceso que ejecuta la operación ALTER TABLE aplicará un "registro en línea" de las operaciones DML que se ejecutaron simultáneamente en la misma tabla de otros subprocesos de conexión. Cuando se aplican las operaciones DML, es posible encontrar un error de entrada de clave duplicada (ERROR 1062 (23000): entrada duplicada), incluso si la entrada duplicada es solo temporal y sería revertida por una entrada posterior en el "registro en línea" . Esto es similar a la idea de una verificación de restricciones de clave externa en InnoDB, en la cual las restricciones deben mantenerse durante una transacción.


Como buscando en su error #1062 - Duplicate entry ''2-S. Name'' for key ''PRIMARY'' #1062 - Duplicate entry ''2-S. Name'' for key ''PRIMARY'' significa que usa la clave principal en su campo numérico, por eso muestra un error duplicado en el campo numérico. Por lo tanto, elimine esta clave principal y luego inserte el duplicado también.


De acuerdo con su código, su "número" y "Nombre" son claves principales y usted está insertando S.NAME en ambas filas, por lo que creará un conflicto. Estamos utilizando la clave principal para acceder a los datos completos. aquí no puede acceder a los datos utilizando la clave principal ''nombre''.

Soy un principiante y creo que podría ser el error.


En caso de que alguien más encuentre este hilo con mi problema, estaba usando un tipo de columna "entero" en MySQL. La fila que intentaba insertar tenía una clave principal con un valor mayor que el permitido por entero. Cambiar a "Bigint" solucionó el problema.


En caso de que esto ayude a alguien además del OP, tuve un problema similar con InnoDB .

Para mí, lo que realmente estaba sucediendo era un error de restricción de clave externa. Yo estaba haciendo referencia a una clave externa que no existía.

En otras palabras, el error fue completamente apagado. La clave principal estaba bien, y al insertar la clave externa primero se solucionó el problema. No tengo idea de por qué MySQL se equivocó de repente.


En mi caso el error fue muy engañoso. El problema fue que PHPMyAdmin usa "ALTER TABLE" cuando haces clic en el botón "make unique" en lugar de "ALTER IGNORE TABLE", así que tuve que hacerlo manualmente, como en:

ALTER TABLE mytbl ADD UNIQUE (columnName);


En mi caso, el error fue causado por el esquema desactualizado, una columna fue originalmente varchar(50) pero el volcado que estaba intentando importar se creó a partir de una versión modificada del esquema que tiene varchar(70) para esa columna (y algunos de las entradas de ese campo donde se utilizan más de 50 caracteres).

Durante la importación, algunas claves se truncaron y la versión truncada ya no era única. Tomó un tiempo para darme cuenta de eso, estaba como "¡pero esta clave supuestamente duplicada ni siquiera existe!".


Este problema se crea a menudo al agregar una columna o al usar una columna existente como clave principal. No se crea debido a una clave principal existente que nunca se creó realmente o debido a daños en la tabla.

Lo que realmente denota el error es que un valor de clave pendiente está en blanco.

La solución es rellenar la columna con valores únicos y luego intentar crear la clave principal nuevamente. No puede haber valores en blanco, nulos o duplicados, o aparecerá este error engañoso.


Probar con incremento automático:

CREATE TABLE IF NOT EXISTS `my_table` ( `number` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `money` int(11) NOT NULL, PRIMARY KEY (`number`,`name`) ) ENGINE=MyISAM;


Sé que este no fue el problema en este caso, pero tuve un problema similar de "Entrada duplicada" al crear una clave principal compuesta:

ALTER TABLE table ADD PRIMARY KEY(fieldA,fieldB);

El error fue algo así como:

#1062 Duplicate entry ''valueA-valueB'' for key ''PRIMARY''

Así que busqué:

select * from table where fieldA=''valueA'' and fieldB=''valueB''

Y la salida mostró solo 1 fila, sin duplicado!

Después de un tiempo, descubrí que si tiene valores NULL en estos campos, recibe estos errores. Al final, el mensaje de error me estaba engañando.


Su código funciona bien en esta demostración:

http://sqlfiddle.com/#!8/87e10/1/0

Creo que estás haciendo la segunda consulta (insertar ...) dos veces. Tratar

select * from my_table

Antes de insertar una nueva fila y obtendrá que sus datos ya existen o no.


Su código y esquema están bien. Probablemente estés probando la versión anterior de la tabla.

http://sqlfiddle.com/#!2/9dc64/1/0

Tu tabla incluso no tiene UNIQUE, por lo que ese error es imposible en esa tabla.

Haga una copia de seguridad de los datos de esa tabla, suéltela y vuelva a crearla.

Tal vez trataste de ejecutar esa CREATE TABLE IF NOT EXIST . No se creó, tiene una versión anterior, pero no hubo ningún error debido a IF NOT EXIST .

Puede ejecutar SQL de esta manera para ver la estructura de la tabla actual:

DESCRIBE my_table;

Editar - añadido más tarde:

Intenta ejecutar esto:

DROP TABLE `my_table`; --make backup - it deletes table CREATE TABLE `my_table` ( `number` int(11) NOT NULL, `name` varchar(50) NOT NULL, `money` int(11) NOT NULL, PRIMARY KEY (`number`,`name`), UNIQUE (`number`, `name`) --added unique on 2 rows ) ENGINE=MyISAM;


Tuve un problema similar, pero en mi caso resultó que usé utf8_general_ci insensible a mayúsculas y minúsculas - utf8_general_ci .

Por lo tanto, cuando intenté insertar dos cadenas que eran diferentes en una comparación que distingue entre mayúsculas y minúsculas, pero igual en una que no distingue entre mayúsculas y minúsculas, MySQL disparó el error y no pude entender qué era un problema, porque utilicé una mayúscula y minúscula. buscar.

La solución es cambiar la intercalación de una tabla, por ejemplo, utilicé utf8_bin que utf8_bin mayúsculas y minúsculas (o utf8_general_cs debería ser una apropiada).