MySQL ON DUPLICATE KEY UPDATE para insertar múltiples filas en una sola consulta

200

Tengo una consulta SQL donde quiero insertar varias filas en una sola consulta. así que usé algo como:

$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 que cuando ejecuto esta consulta, quiero verificar si una UNIQUEclave (que no es la PRIMARY KEY), por ejemplo 'name', anterior, debe verificarse y, si 'name'ya existe, la fila completa correspondiente debe actualizarse de lo contrario.

Por ejemplo, en el ejemplo a continuación, si 'Katrina'ya está presente en la base de datos, se debe actualizar toda la fila, independientemente del número de campos. Nuevamente, si 'Samia'no está presente, se debe insertar la fila.

Pensé en usar:

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é atrapado y confundido acerca de cómo proceder. Tengo varias filas para insertar / actualizar a la vez. Por favor dame una dirección. Gracias.

Prasante
fuente

Respuestas:

480

Use la palabra clave VALUESpara referirse a nuevos valores (ver documentación ).

INSERT INTO beautiful (name, age)
    VALUES
    ('Helen', 24),
    ('Katrina', 21),
    ('Samia', 22),
    ('Hui Ling', 25),
    ('Yumie', 29)
ON DUPLICATE KEY UPDATE
    age = VALUES(age),
     ...
Peter Lang
fuente
2
¿Qué sucede si necesitamos incluir una declaración IF en la ACTUALIZACIÓN que tenga una condición diferente para cada fila?
lógica
2
@logic: Hay varias preguntas relacionadas con esto: búsqueda de StackOverflow . Si ninguno de ellos responde a su pregunta, publique uno nuevo que explique exactamente lo que necesita.
Peter Lang
@logic ¿encontraste alguna solución para tu problema? Actualmente estoy frente mismo problema
Parth Kharecha
Gran sugerencia Si desea incrementar un valor cuando está duplicado, agregue esto después de la parte "ACTUALIZACIÓN DE LLAVE DUPLICADA": total = total + VALORES (total)
Phoenix
1

INSERTAR EN ... EN LA ACTUALIZACIÓN DE LLAVE DUPLICADA solo funcionará para MYSQL, no para SQL Server.

para el servidor SQL, la forma de evitar esto es declarar primero una tabla temporal, insertar valor en esa tabla temporal y luego usar MERGE

Me gusta esto:

declare @Source table
(
name varchar(30),
age decimal(23,0)
)

insert into @Source VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29);


MERGE beautiful  AS Tg
using  @source as Sc
on tg.namet=sc.name 

when matched then update 
set tg.age=sc.age

when not matched then 
insert (name, age) VALUES
(SC.name, sc.age);
li rachel
fuente
15
Sin embargo, quién usa el servidor SQL: D
Jeremy Belolo
-3

Puede usar Reemplazar en lugar de INSERTAR ... EN LA ACTUALIZACIÓN CLAVE DUPLICADA

a1ex07
fuente
28
Sí, pero al usar REPLACE, la fila anterior se elimina antes de insertar la nueva fila. Quiero retener la fila anterior para mantener los identificadores primarios.
Prashant
2
No me di cuenta que la retención de la vieja PK es de alguna manera importante para usted ... Sin duda, SUSTITUIR no funcionará en este caso ...
a1ex07
44
PD: "reemplazar en" requiere privilegios de eliminar e insertar.
Oliver M Grech
2
y por los motivos de eliminación / inserción mencionados anteriormente, también es mucho más lento en estos casos.
Ross
1
¿Qué sucede si desea actualizar algunas columnas? Reemplazar actualizará todo.
imVJ