2011-07-21 13 views
7

Tengo un código con dos consultas mysql.
DELETE FROM my_table WHERE user_id=some_number
INSERT INTO my_table (user_id, ...) VALUES(some_number, ...)mysql insertar después de la eliminación falla debido a "entrada duplicada"

El campo user_id es único.

En casos excepcionales, la inserción falla al reclamar una entrada duplicada. Mi primer instinto me lleva a creer que el DELETE no terminó y ahora el inserto está tratando de insertar y obtengo una entrada duplicada. es posible? ¿Cómo puedo evitar esto? ¿Podría haber una explicación diferente que se te ocurra?

Actualización: La razón por la que estoy borrando es porque quiero eliminar todos los datos que no estoy actualizando/insertando por primera vez. Además, creo que es importante señalar que la mayoría de los datos siguen siendo los mismos.

+0

¿Es posible que sea una condición de carrera en la que dos procesos estén ejecutando esas dos declaraciones para la misma ID al mismo tiempo? –

+0

puede estar interesado en REEMPLAZAR e INSERTAR ... EN LAS ACTUALIZACIONES DUPLICADAS DE ACTUALIZACIÓN DE LLAVE –

+1

¿es posible que DELETE falle? ¿hay algún control después de su ejecución? – ascanio

Respuesta

1

Siempre se puede intentar un COMPROMISO después del BORRAR para asegurarse de que se haya completado.

+0

Solo necesito agregar otra consulta con "COMPROMISO" para intentar eso? Si hay otras consultas lentas también las esperará o ¿puedo simplemente esperar a que termine la eliminación? – Noam

+0

Sí, puedes hacer el commit por sí mismo. De lo que ha publicado de su código en realidad no debería ser necesario, pero obligaría a completar la primera declaración. –

2

Utilice una instrucción UPDATE en su lugar:

UPDATE my_table 
SET my_column = my_value 
WHERE user_id = some_number 
+0

Puede (es una variante de MySQL en la sintaxis 'INSERT INTO'). Mira aquí; http://dev.mysql.com/doc/refman/5.1/en/insert.html –

+0

@ypercube estás en lo correcto. –

+0

La actualización no eliminará los datos anteriores que deseo reemplazar. ¿Derecha? – Noam

2
SET AUTOCOMMIT=0;  
START TRANSACTION;  
DELETE FROM my_table WHERE user_id=some_number;  
INSERT INTO my_table (user_id, ...) VALUES(some_number, ...); 
commit; 
1

¿Por qué te DELETE y luego INSERT la misma solo UPDATE la fila user_id no?

+0

Porque quiero eliminar todos los datos que no estoy actualizando/insertando por primera vez, y estoy no actualizar todas las filas con los mismos datos. Cada nueva fila/fila actualizada tendrá datos diferentes. – Noam

-2

Esto sucede porque las consultas se tratan como dos transacciones únicas, por lo que no se garantiza el orden de ejecución. El efecto que está describiendo es porque el inserto se procesa antes de eliminarlo. Debe cambiar la lógica de consulta o realizar ambas consultas en una sola transacción.

Cuestiones relacionadas