2009-06-25 12 views
5

Estoy usando una tabla de memoria . Tiene varios identificadores y todos los datos son enteros. Mi código actualiza el contador por 1 si los datos existen o crea una línea con contador = 1 si no es así.Mysql Error de entrada duplicada en ON ACTUALIZACIÓN DE LLAVE DUPLICADA

La consulta que uso es:

INSERT INTO linked_mem 
     (id1, id2, id31, id4 cnt) 
     VALUES (31316, 0, 557158967, 261470594, 1) 
     ON DUPLICATE KEY UPDATE cnt= cnt+1 

Ocasionalmente (alrededor del 5% de inserciones) me sale "Entrada duplicada '[números clave]' para la llave 1

¿Cuál podría ser el problema Isn? 't la parte aCTUALIZACIÓN ON DUPLICATE KEY supone para manejar la llave duplicada

cambio: la adición de crear la tabla de la mesa real

CREATE TABLE `linked_mem` (
    `li_sid` int(10) unsigned NOT NULL default '0', 
    `li_id1` int(10) unsigned NOT NULL default '0', 
    `li_cid1` int(10) unsigned NOT NULL default '0', 
    `li_id2` int(10) unsigned NOT NULL default '0', 
    `li_cid2` int(10) unsigned NOT NULL default '0', 
    `cnt` int(10) unsigned NOT NULL default '1', 
    `li_filter` int(10) unsigned NOT NULL default '0', 
    `li_group` int(10) unsigned NOT NULL default '0', 
    PRIMARY KEY (`li_id1`,`li_sid`,`li_cid1`,`li_cid2`,`li_group`,`cnt`,`li_id2`) 
) ENGINE=MEMORY DEFAULT CHARSET=latin1 
+0

puedes subir la tabla de creación de linked_mem –

Respuesta

10

Esto puede suceder si actualiza un campo que está marcado UNIQUE y la segunda violación de clave ocurre en UPDATE.

actualización:

De su estructura de tabla que puedo ver que es exactamente el caso.

Eso es lo que sucede:

INSERT INTO linked_mem 
     (id1, id2, id31, id4 cnt) 
     VALUES (31316, 0, 557158967, 261470594, 1) 

-- inserts 

INSERT INTO linked_mem 
     (id1, id2, id31, id4 cnt) 
     VALUES (31316, 0, 557158967, 261470594, 1) 

-- updates `cnt` to 2 

INSERT INTO linked_mem 
     (id1, id2, id31, id4 cnt) 
     VALUES (31316, 0, 557158967, 261470594, 1) 

-- tries again to update `cnt` to 2 and fails 

Retire cnt de su definición PRIMARY KEY.

1

cnt está en la clave principal, quizás eso es lo que causa el error/la incapacidad para ACTUALIZARLO.

1

¿Está seguro de que la clave principal es la correcta? El uso de esta clave primaria identifica una línea también por el valor de cnt, que se supone que es un contador.

No he probado esto, pero creo que la siguiente consulta dará el error si comienza con una tabla vacía.

INSERT INTO linked_mem 
    (id1, id2, id31, id4, cnt) 
VALUES 
    (1, 1, 1, 1, 1),     // (1, 1, 1, 1, 1) added 
    (1, 1, 1, 1, 1),     // (1, 1, 1, 1, 1) -> (1, 1, 1, 1, 2) 
    (1, 1, 1, 1, 1),     // (1, 1, 1, 1, 1) added (now two rows) 
    (1, 1, 1, 1, 1)     // error 
ON DUPLICATE KEY UPDATE cnt = cnt+1 

en la cuarta fila, la (1, 1, 1, 1, 1) se actualizaría a (1, 1, 1, 1, 2), pero esto ya existe.

0

Es difícil de decir con los nombres de columna no informativos, pero esa clave principal es tan amplia que parece bastante inútil. ¿Qué está haciendo en realidad, y por qué se eligió ese conjunto de columnas? ¿Hay una mejor opción? Supongo que los otros carteles son correctos, y tu actualización está violando el límite implícito de exclusividad del PK; siendo el recuento una de sus columnas PK, eso es bastante esperado.

0

Tuve el mismo problema.

Usando EN DUPLICATE KEY UPDATE y sigue teniendo el error: entrada Duplicar

Fue causado por otra columna tiene un índice de clave única y una fila que tiene un valor vacío en él.

Cuestiones relacionadas