sql >> Base de Datos >  >> RDS >> Mysql

¿Puedo usar ON DUPLICATE KEY UPDATE con una consulta INSERT usando la opción SET?

He usado ON DUPLICATE KEY UPDATE un monton. Para algunas situaciones, es una extensión SQL no estándar la que realmente vale la pena usar.

Primero, debe asegurarse de tener una restricción de clave única en su lugar. El ON DUPLICATE KEY UPDATE La función solo se activa si hubiera habido una violación de clave única.

Este es un formato de uso común:

 $query = "INSERT INTO $table (column1, column2, column3)
 VALUES ('value-1', 'value-2', 'value-3')
 ON DUPLICATE KEY UPDATE
 column1 = values(column1),
 column2 = values(column2),
 column3 = values(column3);"

column1 = values(column1) significa "Actualizar la columna 1 con el valor que se habría insertado si la consulta no hubiera encontrado la infracción de clave duplicada". En otras palabras, solo significa actualizar la columna 1 a lo que hubiera sido si la inserción hubiera funcionado.

Mirando este código, no parece correcto que esté actualizando las tres columnas que está tratando de insertar. ¿Cuál de las columnas tiene una restricción única?

EDITAR:Modificar según el formato 'SET' de la instrucción de inserción mysql según la pregunta del OP.

Básicamente para usar ON DUPLICATE KEY UPDATE , simplemente escriba la declaración de inserción como lo haría normalmente, pero agregue ON DUPLICATE KEY UPDATE cláusula añadida al final. Creo que debería funcionar así:

INSERT INTO $table 
    set column1 = 'value-1',
        column2 = 'value-2',
        column3 = 'value-3'
ON DUPLICATE KEY UPDATE
    column1 = values(column1),
    column2 = values(column2),
    column3 = values(column3);

Nuevamente, una de las columnas que está insertando debe tener un índice único (o una combinación de las columnas). Eso puede ser porque uno de ellos es la clave principal o porque hay un índice único en la tabla.