Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Update wielu wierszy
imbabo
post 26.03.2011, 16:16:02
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 26.03.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
JoShiMa
post 26.03.2011, 17:22:51
Post #2





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

Ostrzeżenie: (0%)
-----


może WHERE id IN(...)



--------------------
Go to the top of the page
+Quote Post
imbabo
post 26.03.2011, 17:57:17
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 26.03.2011

Ostrzeżenie: (0%)
-----


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)


Go to the top of the page
+Quote Post
JoShiMa
post 26.03.2011, 19:26:36
Post #4





Grupa: Zarejestrowani
Postów: 1 374
Pomógł: 149
Dołączył: 1.03.2006

Ostrzeżenie: (0%)
-----


Nie no tak to się nie da.


--------------------
Go to the top of the page
+Quote Post
prachwal
post 26.03.2011, 19:34:44
Post #5





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 13.03.2009
Skąd: lublin

Ostrzeżenie: (0%)
-----


wgraj te dane które chcesz poprawić do jakiejś tabeli tymczasowej a następnie skorzystaj z Join-a
Go to the top of the page
+Quote Post
imbabo
post 26.03.2011, 20:52:05
Post #6





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 26.03.2011

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
prachwal
post 26.03.2011, 21:49:59
Post #7





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 13.03.2009
Skąd: lublin

Ostrzeżenie: (0%)
-----


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;


Ten post edytował prachwal 26.03.2011, 21:50:27
Go to the top of the page
+Quote Post
Valdi_B
post 28.03.2011, 08:12:21
Post #8





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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?

Ten post edytował Valdi_B 28.03.2011, 08:13:16
Go to the top of the page
+Quote Post
prachwal
post 28.03.2011, 08:44:47
Post #9





Grupa: Zarejestrowani
Postów: 171
Pomógł: 18
Dołączył: 13.03.2009
Skąd: lublin

Ostrzeżenie: (0%)
-----


masz rację słowo FROM jest zbędne
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.06.2025 - 04:39