konto usunięte

Temat: Wstawianie warunkowe

Witam, potrzebuję wstawić do bazy danych rekord, jednakże sprawa się komplikuje, ponieważ w bazie danych może być już rekord o danym "kodzie produktu" i w tym wypadku należy jedynie zaktualizować ten istniejący. Wykonanie przez PHP 2 zapytań (select i odpowiednio insert/update) jest jak dla mnie nie wydajne przy liczbie produktów rzędu kilkuset tysięcy. Czy istnieje możliwość napisania takiego zapytania które realizowałoby poniższy pseudo-kod? Baza danych to oczywiście MySQL.

Dziękuję za wszelkie odpowiedzi :)

konto usunięte

Temat: Wstawianie warunkowe

W innych bazach stosuje się Merge. W mySQL istnieje klauzula ON DUPLICATE KEY UPDATE

konto usunięte

Temat: Wstawianie warunkowe

Marcin Molak:
W innych bazach stosuje się Merge. W mySQL istnieje klauzula ON DUPLICATE KEY UPDATE

wymaga zdefiniowania primary key co już nie jest takie oczywiste

konto usunięte

Temat: Wstawianie warunkowe

Przemysław R.:
Marcin Molak:
W innych bazach stosuje się Merge. W mySQL istnieje klauzula
ON DUPLICATE KEY UPDATE

wymaga zdefiniowania primary key co już nie jest takie oczywiste

Fakt. Alternatywnym podejściem jest definicja indeksu unikalnego. Aby nie pominąć niczego najlepiej zajrzeć do dokumentacji http://dev.mysql.com/doc/refman/5.0/en/insert-on-dupli...

konto usunięte

Temat: Wstawianie warunkowe

Znalazłem gdzieś taki skrawek kodu:

SELECT IF(((SELECT COUNT(kod) FROM prod WHERE kod='H7B52') > 0),(UPDATE prod set cena='10'),'')

według niektórych ma on działać w MySQL'u. Czy dałoby się go przepisać (jeśli faktycznie działa) tak aby realizował zadanie insertu, a w przypadku istnienia rekordu update'u?
Jakub L.

Jakub L. Programista

Temat: Wstawianie warunkowe

Janusz Pyzio:
Znalazłem gdzieś taki skrawek kodu:

SELECT IF(((SELECT COUNT(kod) FROM prod WHERE kod='H7B52') > 0),(UPDATE prod set cena='10'),'')

według niektórych ma on działać w MySQL'u. Czy dałoby się go przepisać (jeśli faktycznie działa) tak aby realizował zadanie insertu, a w przypadku istnienia rekordu update'u?

Tu chyba brakuje where w klauzuli update, a jeżeli dobrze rozumiem składnię IF, to klauzula else jest pusta co daje pole do popisu, err, inserta.

Google: insert or update, 3 kliknięcia dalej:
http://dev.mysql.com/doc/refman/5.0/en/insert.html i jeszcze jedno kliknięcie dalej: http://dev.mysql.com/doc/refman/5.0/en/insert-on-dupli...Jakub L. edytował(a) ten post dnia 22.07.10 o godzinie 07:21

konto usunięte

Temat: Wstawianie warunkowe

hmm to powinno wygladac tak :
SELECT IF(((SELECT COUNT(kod) FROM prod WHERE kod='H7B52') > 0),(UPDATE prod set cena='10' WHERE Kod = 'H7B52'),'')

teraz pytanie: jak do sie ma wydajnosciowo do 2 osobnych query czy ktos to sprawdzal ?

Temat: Wstawianie warunkowe

Janusz Pyzio:
Witam, potrzebuję wstawić do bazy danych rekord, jednakże sprawa się komplikuje, ponieważ w bazie danych może być już rekord o danym "kodzie produktu" i w tym wypadku należy jedynie zaktualizować ten istniejący. Wykonanie przez PHP 2 zapytań (select i odpowiednio insert/update) jest jak dla mnie nie wydajne przy liczbie produktów rzędu kilkuset tysięcy. Czy istnieje możliwość napisania takiego zapytania które realizowałoby poniższy pseudo-kod? Baza danych to oczywiście MySQL.

Dziękuję za wszelkie odpowiedzi :)


czy wstawianie rekord po rekordzie jest wymogiem? Zrobiłem kiedyś coś takiego w dwóch zapytaniach dla wszystkich rekordów łącznie (ale na MSSQL).

konto usunięte

Temat: Wstawianie warunkowe

Nie wiem czy uda się w dwóch zapytaniach to wykonać, gdyż produktów w sklepie tak jak pisałem jest od kilku do kilkaset tysięcy (zależnie od sklepu) i w pierwszej kolejności każdy produkt należy porównać do tego z pliku xml, a następnie wykonać insert lub update.
Może źle mi się wydaje, ale będzie tu potrzebne tyle select'ów ile produktów i w drugim zapytaniu cała seria insert'ów i update'ów, chyba, że jest jakieś wydajniejsze rozwiązanie?
EDIT:
Ew. tyle ile produktów przy założeniu, że użyjemy MySQL'owego if'a.Janusz Pyzio edytował(a) ten post dnia 22.07.10 o godzinie 11:31

Temat: Wstawianie warunkowe

Nie ręcze że zadziała na MySQL i pisałem to w notatniku więc mogą być błędy - ale istota jest mniej więcej taka.
Celem jest zasilenie tabeli docelowej. Wcześniej w tabeli importu zbieram nowe rekordy, które posłużą albo do updateowania albo do insertowania na tabeli docelowej.

UPDATE tabela_docelowa
SET
kolumna1 = tabela_importu.kolumna1,
kolumna2 = tabela_importu.kolumna2,
kolumna3 = tabela_importu.kolumna3
FROM tabela_docelowa
INNER JOIN tabela_importu
ON tabela_importu.PK = tabela_docelowa.PK

INSERT INTO tabela_docelowa(PK, kolumna1, kolumna2, kolumna3)
SELECT tabela_importu.PK,
tabela_importu.kolumna1,
tabela_importu.kolumna2,
tabela_importu.kolumna3
FROM tabela_importu LEFT OUTER JOIN tabela_docelowa
ON tabela_importu.PK = tabela_docelowa.PK
WHERE (tabela_docelowa.PK IS NULL)

konto usunięte

Temat: Wstawianie warunkowe

no tak czy inaczej musisz przeleciec po wszystkich produktach jezeli chcesz sprawdzic czy istnieje juz taki rekord. w pseudokodzie to mniej wiecej tak:

cmd = "select count(kolumna_id) as cnt where kod = 'jakisprodukt'";

if (Convert.ToInt32(cmd.ExecuteScalar()) > 0)
{
// tu robisz update
}else
{
// a tu Insert
}
i to wykonujesz za kazdym razem kiedy chcesz dodac/zmienic rekord...Marcin Pluta edytował(a) ten post dnia 22.07.10 o godzinie 17:53

Temat: Wstawianie warunkowe

a próbowałeś użyć polecenia REPLACE?
działa jak połączenie INSERT i UPDATE :)

tutaj pomoc: http://dev.mysql.com/doc/refman/5.0/en/replace.html

Następna dyskusja:

Warunkowe formatowanie wykr...




Wyślij zaproszenie do