MySQL na duplikat aktualizacji klucza dla wielu wierszy wstawić w jednym zapytaniu

Mam zapytanie SQL, w którym chcę wstawić wiele wierszy w jednym zapytaniu. więc użyłem czegoś takiego:

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

mysql_query( $sql, $conn );

Problem polega na tym, że gdy wykonuję to zapytanie, chcę sprawdzić, czy klucz UNIQUE (który nie jest PRIMARY KEY), np. 'name' powyżej, powinien być sprawdzony i jeśli taki 'name' już istnieje, odpowiedni cały wiersz powinien zostać zaktualizowany w przeciwnym razie wstawiony.

Na przykład w poniższym przykładzie, jeśli 'Katrina' jest już obecny w bazie danych, cały wiersz, niezależnie od liczba pól, należy zaktualizować. Jeśli 'Samia' nie jest obecny, wiersz powinien zostać wstawiony.

Myślałem o użyciu:

INSERT INTO beautiful (name, age)
      VALUES
      ('Helen', 24),
      ('Katrina', 21),
      ('Samia', 22),
      ('Hui Ling', 25),
      ('Yumie', 29) ON DUPLICATE KEY UPDATE
Oto pułapka. Utknąłem i pogubiłem się co do sposobu postępowania. Mam wiele wierszy do wstawienia/aktualizacji na raz. Proszę, podaj mi kierunek. Dzięki.
Author: Acorn, 2010-04-26

3 answers

Użyj słowa kluczowego VALUES, Aby odwołać się do nowych wartości(zobacz Dokumentacja).

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/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-11 21:39:41

Możesz użyć Zastąp zamiast INSERT ... PRZY AKTUALIZACJI DUPLIKATU KLUCZA.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-26 15:18:40

INSERT INTO ... Aktualizacja duplikatu klucza będzie działać tylko dla MYSQL, a nie dla SQL Server.

Dla SQL server sposobem obejścia tego problemu jest najpierw zadeklarowanie tabeli tymczasowej, Wstaw wartość do tej tabeli tymczasowej, a następnie użycie MERGE

Tak:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-21 21:43:30