2010-04-26 15 views
144

Mam kwerendę sql, gdzie chcę wstawić wiele wierszy w jednym kwerendzie. tak kiedyś coś takiego:MySQL ON DUPLICATE KEY UPDATE dla wielu wierszy wstaw w pojedynczym zapytaniu

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

mysql_query($sql, $conn); 

Problemem jest to, kiedy wykonać to zapytanie, chcę sprawdzić, czy klucz UNIQUE (co nie jest klucz podstawowy), na np. "nazwa" w powyższym przypadku powinna być sprawdzona, a jeśli taka "nazwa" już istnieje, odpowiedni cały wiersz powinien zostać zaktualizowany inaczej wstawiony.

Na przykład w poniższym przykładzie, jeśli "Katrina" jest już obecna w bazie danych, cały wiersz, niezależnie od liczby pól, powinien zostać zaktualizowany. Ponownie, jeśli "Samia" nie jest obecny, należy wstawić wiersz.

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 zdezorientowany, jak postępować. Mam wiele wierszy do wstawienia/aktualizacji naraz. Proszę, daj mi kierunek. Dzięki.

Odpowiedz

338

Użyj słowa kluczowego VALUES, aby odnieść się do nowych wartości (patrz 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

Dzięki za tonę. Właśnie tego chcę ... Jeszcze raz dziękuję ... – Prashant

+10

** piękny **, dokładnie to, czego potrzebowałem. * heh, zobacz co tam zrobiłem? * –

+0

Co zrobić, jeśli potrzebujemy dodać instrukcję IF w AKTUALIZACJI, która ma inny warunek dla każdego wiersza? – logic

-1

Możesz użyć Replace zamiast INSERT ... ON DUPLICATE KEY UPDATE.

+16

Tak, ale przy użyciu REPLACE stary wiersz zostanie usunięty przed wstawieniem nowego wiersza. Chcę zachować stary wiersz do zachowania podstawowych identyfikatorów. – Prashant

+2

Nie zdawałem sobie sprawy, że zachowanie starego PK jest dla ciebie jakoś ważne ... Z pewnością, REPLACE nie zadziała w tym przypadku ... – a1ex07

+0

Jeśli nie dbasz o PK, tak jak w moim przypadku, to działa doskonale. – MLeFevre

Powiązane problemy