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. 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),
...
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.
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);
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