solucion primary para for error entry entrada duplicate duplicada code clave mysql sql mysql5

mysql - para - duplicate entry for key primary solucion



MySQL 1062-Entrada duplicada ''0'' para la clave ''PRIMARY'' (4)

Debe especificar la clave principal como autoincremento

CREATE TABLE `momento_distribution` ( `momento_id` INT(11) NOT NULL AUTO_INCREMENT, `momento_idmember` INT(11) NOT NULL, `created_at` DATETIME DEFAULT NULL, `updated_at` DATETIME DEFAULT NULL, `unread` TINYINT(1) DEFAULT ''1'', `accepted` VARCHAR(10) NOT NULL DEFAULT ''pending'', `ext_member` VARCHAR(255) DEFAULT NULL, PRIMARY KEY (`momento_id`, `momento_idmember`), KEY `momento_distribution_FI_2` (`momento_idmember`), KEY `accepted` (`accepted`, `ext_member`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1$$

Con respecto a los comentarios a continuación, ¿qué tal:

ALTER TABLE `momento_distribution` CHANGE COLUMN `id` `id` INT(11) NOT NULL AUTO_INCREMENT, DROP PRIMARY KEY, ADD PRIMARY KEY (`id`);

Una PRIMARY KEY es un índice único, por lo que si contiene duplicados, no puede asignarle a la columna un índice único, por lo que es posible que necesite crear una nueva columna por completo.

Tengo la siguiente tabla en MySQL versión 5.5.24

DROP TABLE IF EXISTS `momento_distribution`; CREATE TABLE IF NOT EXISTS `momento_distribution` ( `momento_id` INT(11) NOT NULL, `momento_idmember` INT(11) NOT NULL, `created_at` DATETIME DEFAULT NULL, `updated_at` DATETIME DEFAULT NULL, `unread` TINYINT(1) DEFAULT ''1'', `accepted` VARCHAR(10) NOT NULL DEFAULT ''pending'', `ext_member` VARCHAR(255) DEFAULT NULL, PRIMARY KEY (`momento_id`, `momento_idmember`), KEY `momento_distribution_FI_2` (`momento_idmember`), KEY `accepted` (`accepted`, `ext_member`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Tiene muchos datos con relaciones de muchos a uno con otras dos tablas con ondelete=restrict y onupdate=restrict .

Ahora, necesito cambiar la estructura e introducir una clave primaria separada en la tabla, mientras sigo manteniendo las relaciones y los datos existentes. Para eso, ejecuté la siguiente consulta:

ALTER TABLE `momento_distribution` ADD `id` INT( 11 ) NOT NULL FIRST; ALTER TABLE `momento_distribution` DROP PRIMARY KEY , ADD PRIMARY KEY ( `id` );

Desafortunadamente, mi segunda consulta falló con el siguiente error:

1062 - Entrada duplicada ''0'' para la clave ''PRIMARY''

¿Alguien puede señalar el problema? Supongo que el problema es la relación existente, pero no quiero perder la relación o los datos existentes, que tienen varios miles de filas. ¿Hay alguna manera de hacer esto sin perder datos?

EDITAR: Al ver los datos, veo que la columna recién creada tiene el valor ''0''. Probablemente esto no permite cambiar la clave principal debido a registros duplicados (en la nueva clave principal)

Tengo más de 8,000 filas, así que no puedo cambiarlas manualmente. ¿Hay alguna forma de asignar rowid a una nueva clave principal?


Ejecute la siguiente consulta en la consola de mysql:

SHOW CREATE TABLE momento_distribution

Compruebe la línea que se parece a algo

CONSTRAINT `momento_distribution_FK_1` FOREIGN KEY (`momento_id`) REFERENCES `momento` (`id`)

Puede ser diferente, solo adivino qué podría ser. Si tiene una clave externa en ''momento_id'' y ''momento_idmember'', obtendrá dos nombres de clave extranjeros. El siguiente paso es eliminar las claves externas. Ejecute las siguientes consultas:

ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_1 ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_2

Asegúrese de cambiar el nombre de la clave externa por el que obtuvo de la consulta CREATE TABLE . Ahora no tiene ninguna clave externa, por lo que puede eliminar fácilmente la clave principal . Pruebe lo siguiente:

ALTER TABLE `momento_distribution` DROP PRIMARY KEY

Agregue la columna requerida de la siguiente manera:

ALTER TABLE `momento_distribution` ADD `id` INT( 11 ) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST

Esta consulta también agrega números, por lo que no necesitará depender de @rowid. Ahora necesita agregar la clave externa a las columnas anteriores. Para eso, primero haga estos índices:

ALTER TABLE `momento_distribution` ADD INDEX ( `momento_id` ) ALTER TABLE `momento_distribution` ADD INDEX ( `momento_idmember` )

Ahora agrega las claves foráneas. Cambie la tabla / columna de referencia según lo necesite:

ALTER TABLE `momento_distribution` ADD FOREIGN KEY ( `momento_id`) REFERENCES `momento` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT ALTER TABLE `momento_distribution` ADD FOREIGN KEY ( `momento_idmember`) REFERENCES `member` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT

Espero que ayude. Si obtiene algún error, edite la pregunta con la estructura de las tablas de referencia y los códigos de error que está obteniendo.


compruebe si su campo con la clave principal está configurado para aumentar automáticamente


este paso funciona perfectamente para mí ... puedes intentarlo

  1. Agregar indexación
  2. Agregar Autoincrement
  3. Agregar clave principal

Espero que funcione para ti también. buena suerte