Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Replace/Update w zależności od przypadku
athabus
post 5.12.2006, 11:09:24
Post #1





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Witam,
napotkałem problem przy imporcie danych. Otóż załóżmy, że mam tabelę:

Id | kod kreskowy | Cena


Raz na jakiś czas muszę pobrać dane z innej bazy i zapisać je w tej tabeli. Problem w tym, że w tej tabeli jest pole 'kodKreskowy', które nie występuje w drugiej bazie danych. Dlatego też chciałbym aby podczas importowania danych w to pole wstawiała się wartość domyślna jeśli dany rekord nie istniał wcześnie w tabeli lub jeśli rekord już istniał aby kod kreskowy się nie zmieniał (inaczej mówiąc nie był usuwany)

Zatem mam pytanie czy istnieje możliwość takiego skonstruowania zapytania, aby osiągnąć ten cel. Dodam, że tabela z której importuje dane może zawierać rekordy które nie występują w mojej bazie danych, więc zwykły update odpada.

Próbowałem zrobić to za pomocą Replace bez podawania pola "kodKreskowy" ale wtedy wstawia się zawsze wartość domyślna, nawet jeśli pole zawierało kod kreskowy.


Będę wdzięczny za pomoc.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
siemakuba
post 5.12.2006, 11:22:54
Post #2





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


Pierwsza myśl:
  1. UPDATE tabela SET kod_kreskowy = IF(kod_kreskowy IS NULL, nowy_kod_kreskowy, kod_kreskowy);

Powinno dać radę ;>

pozdr.
Go to the top of the page
+Quote Post
athabus
post 5.12.2006, 11:30:07
Post #3





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


hehe no właśnie chodzi o coś zupełnie odwrotnego.

Pobieram dane z innej bazy:

i potem

jeśli wiersz nie istnieje w mojej tabeli to go wstawiam

jeśli wiersz istnieje w mojej tabeli, to robie update wszystkich pól poza "kodKreskowy" - kody kreskowe mam zapisane tylko w mojej tabeli i nie chcę aby po każdym updacie cen itp. kody były wymazywane.

Na razie jedyne co mi przyszło do głowy to sprawdzanie czy dany wiersz istnieje w bazie i w zależnoci od tego czy istnieje czy nie wywoływać Insert lub update - ale to jest ogromna ilość zapytań, więc pewnie da sie lepiej.
Go to the top of the page
+Quote Post
siemakuba
post 5.12.2006, 11:38:08
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


Cytat(athabus @ 5.12.2006, 11:30:07 ) *
Na razie jedyne co mi przyszło do głowy to sprawdzanie czy dany wiersz istnieje w bazie i w zależnoci od tego czy istnieje czy nie wywoływać Insert lub update - ale to jest ogromna ilość zapytań, więc pewnie da sie lepiej.


Czy każdy istniejący w twojej bazie wiersz zawiera pole kod_kreskowy, które przy updejcie ma być nie ruszane?
Jeżeli tak, to:

1. pobierasz wszystkie dane ze swojej bazy.
2. na podstawie tych pobranych danych dzielisz nowe dane na te do dodania i te do zaktualizowania
3. dla tych do dodania - INSERT, dla tych do zaktualizowania - UPDATE

Z pewnością musisz pobrać jednorazowo sporo danych, ale i tak chyba będzie to szybsze niż zapytanie istnienie każdego kolejnego wpisu.

pozdr.
Go to the top of the page
+Quote Post
athabus
post 5.12.2006, 11:56:05
Post #5





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Dzięki, to na pewno jest usprawnienie... Czemu o tym sam nie pomyślałem? - chyba kawy za mało :-)

Czyli w SQL nie ma zapytania, które załatwiłoby wszystko samo? Miałem nadzieje, że wystarczy gdzieś flagi poustawiać i wszystko pójdzie - no ale cóż, trzeba sie barć do pisania.
Go to the top of the page
+Quote Post
siemakuba
post 5.12.2006, 12:11:44
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 112
Pomógł: 20
Dołączył: 10.04.2005

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


Hm, czy samo MySQL może coś zdziałać - tego niestety nie wiem :/
Być może warto zerknąć tu: INSERT ... ON DUPLICATE KEY UPDATE Syntax
Niestety też do końca nie wiem czy to jest coś co rozwiąże twój problem. Nigdy nie korzystałem, a wpadło w oko w dokumentacji.

pozdr.
Go to the top of the page
+Quote Post
athabus
post 5.12.2006, 12:29:02
Post #7





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Muszę sie temu przyjrzeć - ale wygląda na to czego szukam ;-)

Jeszcze raz dzięki za pomoc
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: 14.08.2025 - 03:37