2010-04-26 23 views
144

Tengo una consulta SQL donde quiero insertar varias filas en una sola consulta. por lo que utiliza algo como:MySQL ON DUPLICATE KEY UPDATE para insertar varias filas en una sola consulta

$sql = "INSERT INTO beautiful (name, age) 
    VALUES 
    ('Helen', 24), 
    ('Katrina', 21), 
    ('Samia', 22), 
    ('Hui Ling', 25), 
    ('Yumie', 29)"; 

mysql_query($sql, $conn); 

El problema es cuando yo haga esta consulta, quiero comprobar si una clave única (que no es la clave principal), por ejemplo. 'nombre' en el caso anterior, debe verificarse y si ese 'nombre' ya existe, la fila completa correspondiente debe actualizarse de lo contrario insertada.

Por ejemplo, en el ejemplo siguiente, si 'Katrina' ya está presente en la base de datos, se debe actualizar toda la fila, independientemente del número de campos. De nuevo, si 'Samia' no está presente, la fila debe insertarse.

I pensado en utilizar:

INSERT INTO beautiful (name, age) 
     VALUES 
     ('Helen', 24), 
     ('Katrina', 21), 
     ('Samia', 22), 
     ('Hui Ling', 25), 
     ('Yumie', 29) ON DUPLICATE KEY UPDATE 

Aquí está la trampa. Me quedé atascado y confundí cómo proceder. Tengo varias filas para insertar/actualizar a la vez. Por favor dame la dirección. Gracias.

Respuesta

338

Use la palabra clave VALUES para hacer referencia a los nuevos valores (consulte documentation).

INSERT INTO beautiful (name, age) 
    VALUES 
    ('Helen', 24), 
    ('Katrina', 21), 
    ('Samia', 22), 
    ('Hui Ling', 25), 
    ('Yumie', 29) 
ON DUPLICATE KEY UPDATE 
    age = VALUES(age), 
    ... 
+6

Gracias una tonelada. Eso es exactamente lo que quiero ... Gracias de nuevo ... – Prashant

+10

** hermosa **, exactamente lo que necesitaba. * heh, ¿ves lo que hice allí? * –

+0

¿Qué sucede si tenemos que incluir una declaración IF en la ACTUALIZACIÓN que tiene una condición diferente para cada fila? – logic

-1

Puede usar Replace en lugar de INSERTAR ... EN ACTUALIZACIÓN DE LLAVE DUPLICADA.

+16

Sí, pero utilizando REEMPLAZAR se borra la fila anterior antes de insertar la nueva fila. Quiero conservar la fila anterior para mantener los identificadores primarios. – Prashant

+2

No me di cuenta de que retener el antiguo PK es de alguna manera importante para usted ... Sin duda, REPLACE no funcionará en este caso ... – a1ex07

+0

Sin embargo, si no le importa PK, como en mi caso, esto funciona perfectamente. – MLeFevre

Cuestiones relacionadas