Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Replace/Update w zależności od przypadku
Forum PHP.pl > Forum > Bazy danych > MySQL
athabus
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.
siemakuba
Pierwsza myśl:
  1. UPDATE tabela SET kod_kreskowy = IF(kod_kreskowy IS NULL, nowy_kod_kreskowy, kod_kreskowy);

Powinno dać radę ;>

pozdr.
athabus
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.
siemakuba
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.
athabus
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.
siemakuba
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.
athabus
Muszę sie temu przyjrzeć - ale wygląda na to czego szukam ;-)

Jeszcze raz dzięki za pomoc
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.