Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Update wielu wierszy
Forum PHP.pl > Forum > Bazy danych > MySQL
imbabo
Witam , mam pytanie.
Czy istnieje konstrukcja zapytania UPDATE , podobna do konstrukcji zapytania INSERT ?
Chodzi mi dokładnie o coś takiego:
  1. INSERT INTO TABLE
  2. (id1, kol1)
  3. VALUES
  4. (1,3),
  5. (2,4)

Czy jeżeli chce zrobić update wielu wierszy , każdy o innym id , to muszę za każdym razem wysyłać zapytanie do bazy o każdy zmieniany wiersz ?
Nie da się wysłać jednego dużego zapytania jak w konstrukcji INSERT ?
A może skorzystać z instrukcji INSERT ON DUPLICATE KEY UPDATE ?
Pytam ponieważ potrzebuje "zoptymalizować" ruch sieciowy i wysyłać jak najmniej pakietów. Lepiej wysłać jeden duży niż kilka małych.
Pozdrawiam i dziękuje za wszelaką pomoc.
JoShiMa
może WHERE id IN(...)

imbabo
Może i to by działało , tylko jak teraz podać wartości które chciałbym wstawić w poszczególne id ?

Dopóki jest coś takiego :
  1. UPDATE tabela SET wartosc = 1 WHERE id IN (1,2,3)

To wszystko jest dobrze i robi się update wierszy o id 1,2,3.
Jednak jeżeli chciałbym wprowadzić różne wartości dla każdego id to jakbym miał to zapisać ?

Coś takiego niestety wyrzuca błąd o tym iż nie istnieją kolumny:
  1. UPDATE tabela SET wartosc = (1,2,3) WHERE id IN (1,2,3)


JoShiMa
Nie no tak to się nie da.
prachwal
wgraj te dane które chcesz poprawić do jakiejś tabeli tymczasowej a następnie skorzystaj z Join-a
imbabo
Też mnie to nie urządza, wyjaśnie dlaczego.
Otóż odpytuje cykliczne jakieś urządzenie, które zwraca mi dane , te natomiast są w moim programie porównywane ze starymi danymi i wysyłane dalej do bazy tylko te które się zmieniły. Jednak taki cykl odbywa się co sekundę , dlatego musiałbym w każdym cyklu tworzyć i usuwać tabele tymczasową.
I wysyłać minimum 4 zapytania. Nawet jeżeli wystąpiłby tylko 1 Update... Tak się zastanawiam czy to ma sens. Kiedy wystąpiłby update 5 i więcej wierszy naraz to pewnie by miało. Ale dzięki za pomoc. Przemyśle czy w ten sposób warto to zrobić.
Jakby jednak dało się jednym zapytaniem zmienić wszystko byłoby milej i pewniej.
prachwal
to xrób tabele na stałe!

później robisz
  1. TRUNCATE tabela;
  2. INSERT INTO tabela (pole, wartosc)VALUES (1,2)(2,4)(3,6);
  3. UPDATE FROM tblTransaction AS t
  4. LEFT JOIN tabela AS e
  5. ON e.pole= t.pole
  6. SET t.wartosc= e.wartosc;
Valdi_B
Skoro takie aktualizacje chcesz robić często, to spróbuj innego chwytu:
1. PREPARE - przygotowujesz instrukcję (1 raz na początku).
W treści mogą być znaki "?" (placeholdery) - miejsca na podstawienie konkretnych wartości.
2. EXECUTE ... USING <lista wartości> - właściwe wykonanie.

Zysk polega na szybkości, bo PREPARE wykonujesz 1 raz, a potem taką instrukcję możesz wielokrotnie i szybko wykonać z podstawieniem konkretnych wartości.

Szczegóły doczytaj na stronie:
http://dev.mysql.com/doc/refman/5.1/en/sql...statements.html

To co powyżej - wykonujesz na poziomie SQL.
Możesz spróbować jeszcze innego wariantu:

W ramach biblioteki PDO są funkcje prepare i execute o podobnej funkcjonalności.
Zobacz na stronie:
http://pl.php.net/manual/pl/pdo.prepare.php

Wątpię jednak czy to będzie szybsze.
Poza tym pytanie - jaką biblioteką operujesz obecnie na bazie i czy chce Ci się zmieniać na PDO?

Na koniec uwaga do propozycji Przedmówcy:
W dokumentacji MySQLnie mogę się doszukać opisu zdania UPDATE FROM <tablica>.
Czy to na pewno chodzi w MySQL?
prachwal
masz rację słowo FROM jest zbędne
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.