MySQL EN LA ACTUALIZACIÓN DE CLAVE DUPLICADA para insertar varias filas en una sola consulta


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 ejecute esta consulta, quiero verificar si una clave UNIQUE (que no es la PRIMARY KEY), por ejemplo, 'name' anterior, debe verificarse y si tal 'name' ya existe, la fila completa correspondiente debe actualizarse si no se inserta.

Por ejemplo, en el siguiente ejemplo, si 'Katrina' ya está presente en la base de datos, toda la fila, independientemente de la número de campos, debe actualizarse. De nuevo 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é atascado y confundido sobre cómo proceder. Tengo varias filas para insertar / actualizar a la vez. Por favor, dame una dirección. Gracias.

Author: Acorn, 2010-04-26

3 answers

Use la palabra clave VALUESpara referirse a nuevos valores (vea la 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),
     ...
 383
Author: Peter Lang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-11 21:39:41

Puede usar Reemplazar en lugar de INSERTAR ... EN LA ACTUALIZACIÓN DE CLAVES DUPLICADAS.

 0
Author: a1ex07,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-26 15:18:40

INSÉRTESE EN ... EN LA ACTUALIZACIÓN DE CLAVE DUPLICADA solo funcionará para MYSQL, no para SQL Server.

Para SQL server, la forma de evitar esto es declarar primero una tabla temporal, insertar un valor en esa tabla temporal y luego usar MERGE

Así:

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);
 0
Author: li rachel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-21 21:43:30