2011-10-01 30 views
5

que he visto lo siguiente (utilizando la opción VALORES):¿Puedo usar ON DUPLICATE KEY UPDATE con una consulta INSERT usando la opción SET?

$query = "INSERT INTO $table (column-1, column-2, column-3) VALUES ('value-1', 'value-2', 'value-3') ON DUPLICATE KEY UPDATE SET column1 = value1, column2 = value2, column3 = value3, ID=LAST_INSERT_ID(ID)"; 

... pero no puedo imaginar cómo agregar EN DUPLICADO KEY UPDATE a lo que estoy usando:

$query = "INSERT INTO $table SET 
    column-1 ='value-1', 
    column-2 ='value-2', 
    column-3 ='value-3' 
"; 

por ejemplo :, pseudo-código

$query = "INSERT INTO $table SET 
    column-1 ='value-1', 
    column-2 ='value-2', 
    column-3 ='value-3' 
    ON DUPLICATE KEY UPDATE SET 
    column1 = value1, 
    column2 = value2, 
    column3 = value3, 
    $id=LAST_INSERT_ID(id)"; 
    $my_id = mysql_insert_id(); 
"; 

que iba a encontrar este último más fácil de leer. Agradecería una aclaración, no encontró un ejemplo en el manual.

aplausos

Respuesta

14

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

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

Aquí 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) medios "Actualización column1 con el valor que habría sido insertada si la consulta no se había dado en la violación de clave duplicada." En otras palabras, solo significa actualizar la columna 1 a lo que hubiera sido si la inserción hubiera funcionado.

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

EDITAR: Modifica en función del formato 'SET' de la instrucción de inserción de mysql según la pregunta del OP.

Básicamente para usar ON DUPLICATE KEY UPDATE, simplemente escriba la instrucción de inserción como lo haría normalmente, pero agregue la cláusula ON DUPLICATE KEY UPDATE 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); 

Una vez más, una de las columnas vas a insertar tiene que tener un índice único (o una combinación de las columnas). Eso puede deberse a que uno de ellos es la clave principal o porque hay un índice único en la tabla.

+0

Gracias Kevin. Mi columna de ID es clave principal y tiene índice único. Creo que entiendo cómo funciona ON DUPLICATE KEY, pero mi problema es agregarlo a una sintaxis INSERT diferente, una usando SET en oposición a VALUES. Me gustaría ver un ejemplo de esa sintaxis si es factible. – shecky

+0

y solo para aclarar: quiero utilizar ACTUALIZACIÓN DE LLAVE DUPLICADA para evitar duplicaciones en la actualización, aunque estoy usando un encabezado para redirigir al usuario a la página de resultados, pero no puedo evitar que el usuario regrese y vuelva a enviarla. así que sí, pensé que actualizaría todos los campos si el ID existe. – shecky

+0

He modificado el ejemplo para usar el formato que está preguntando, ¡al menos creo que sí! –

1
+0

Gracias Kemal. REPLACE también parece un método apropiado, sin embargo, las distinciones entre REEMPLAZAR Y ACTUALIZAR CLAVE DUPLICADA aún no me resultan del todo claras. Leeré en REEMPLAZAR. – shecky

+0

P.s. Según tengo entendido, REEMPLAZAR podría desaprovechar la indexación de forma no deseada, así que voy a tratar de hacer que funcione DUPLICATE KEY UPDATE. De nuevo, Kemal – shecky

+0

ver detalles sobre reemplazar aquí http://stackoverflow.com/questions/4205181/insert-to-table-or-update-if-exists-mysql – frazras

Cuestiones relacionadas