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
- Agregar indexación
- Agregar Autoincrement
- Agregar clave principal
Espero que funcione para ti también. buena suerte