2010-07-05 15 views
7

¿Cuáles son los pensamientos de la gente en el camino más eficiente en el desempeño de hacer la siguiente consulta:MySQL 'ACTUALIZACIÓN EN LLAVE DUPLICADA' sin una columna única?

  • 3 tabla de columna

  • si ya existe la combinación de col_1 y col_2 valores UPDATE col_3

  • else INSERT nueva fila

Supongo que necesito algún tipo si ACTUALIZADO EN DUPLICATE KEY (que nunca he usado antes), sin embargo, no tengo una 'KEY', sino un par de dos valores (columnas) para hacer una clave ...

Respuesta

15

Puede crear una clave PRIMARY o UNIQUE de varias columnas (llamada una clave compuesta) en MySQL, que permitirá que ON DUPLICATE KEY funcione bien.

// create a composite index 
CREATE INDEX my_composite_index ON my_table (column1, column2); 

// insert or update 
INSERT INTO my_table (column1, column2) VALUES ('value1', 'value2') ON DUPLICATE KEY UPDATE column3=column3+1; 
+0

gracias ceejayoz, ¿me puede dar algún código de muestra para ON DUPLICATE KEY por favor? – Haroldo

+0

@Haroldo Hecho, ver edición. – ceejayoz

+0

increíble, muy amable de tu parte, ¡muchas gracias! Debería comprobar rápidamente: solo necesito crear el índice una vez, ¿verdad? – Haroldo

1

forma más eficiente es crear CLAVE único y utilizar ON DUPLICATE KEY UPDATE.

manera más lenta es:
LOCK TABLE
TABLA SELECT (se necesita un índice de todos modos para el mejor rendimiento)
si existe, actualizar
demás INSERT
DESBLOQUEO TABLAS

-1

Editar: Ignorar mis sugerencias

Puede usar una clave compuesta como dijo ceejayoz, sin embargo, creo que es necesario REEMPLAZAR EN lugar de ACTUALIZAR EN EL DU PLICATE KEY porque REPLACE también se inserta si no se encuentra un duplicado.

Nota: No conozco el funcionamiento de UPDATE ON DUPLICATE KEY pero parece que no realiza insertos.

+3

'ON DUPLICATE KEY UPDATE' es solo para consultas 'INSERT', en realidad. http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html 'REPLACE INTO' es una mala elección porque no te permite actualizar solo un campo o dos: tienes para especificar valores para toda la fila. – ceejayoz

+0

Malo, gracias por el comentario –

Cuestiones relacionadas