Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] 'ON DUPLICATE KEY UPDATE' - jak otrzymać id zmodyfikowanych rekordów?
Forum PHP.pl > Forum > PHP
kiler129
Witjacie!
Problem jest dość prosty. Wykonuje zapytanie "INSERT INTO x ON DUPLICATE KEY UPDATE...". Tabela ma klucz unique na pola A oraz B. Kluczem primary z auto increment jest C.
Po wykonaniu zapytania chciałbym w jakiś sposób dowiedzieć się jakie wartości C miały zmodyfikowane rekordy (czyli te które były już w tabeli i zostały zmodyfikowane a nie dodane).
Brzmi jak przekombinowana idea ale taką nie jest - schemat wygląda tak, że użytkownik wyszukuje coś, dostaje wyniki z lokalnej bazy a dodatkowo są "doładowywane" wyniki z zewnętrznego serwera. Aby nie pytać go znowu o to samo dodaje te wyniki do lokalnej bazy jednakże dane są niepełne - crontab co 24h dodatkowo przelicza pewne wartości i dodaje dodatkowe informacje w drugiej tabeli kluczownej po owym C smile.gif
Uff, ale się rozpisałem - mam nadzieję, że ktoś dobroduszny przeczyta i podpowie smile.gif
pmir13
Jeżeli wrzucasz pojedyncze rekordy to dość łatwo - mysql_affected_rows() będzie dla wstawionych 1, dla update 2.
Jeśli wiele jednocześnie, może rozbić w pętli na pojedyncze?
Swoją drogę trochę dziwne, że dla dwóch unikalnych kluczy używasz tej konstrukcji. Czy update faktycznie coś zmienia?
Jeśli tak to mogą być problemy, gdy to co chcesz wstawić już będzie pasować albo wg jednego klucza albo drugiego.
Tylko pierwszy z nich zostanie zmieniony.
Pilsener
Niestety baza nie zwraca ID rekordów a jedynie zmienioną ich ilość (chyba, że o czymś nie wiem).
Jedyne sensowne rozwiązanie to napisanie selecta, który wywali ID rekordów do modyfikacji. Można założyć, że te rekordy zostały zmodyfikowane lub rozbić zapytanie aktualizujące i użyć tego selecta do updatu jeśli ID = nasz select i insertu, jeśli ID != nasz select.
pmir13
Sam ID zwraca nam mysql_insert_id(), tylko trzeba było najpierw wiedzieć czy było wstawienie, czy update, bo ta funkcja zwraca id w obu przypadkach.
Czyli przykładowy kod:
  1. $query = "INSERT INTO licznik_postow ( id_autora, ile ) VALUES ( $id_autora, 1 ) ON DUPLICATE KEY UPDATE ile=ile+1";
  2. $res = mysql_query( $query ) or die( mysql_error() );
  3.  
  4. $affected = mysql_affected_rows();
  5.  
  6. if( $affected == 2 )
  7. $id_update = $id; // bylo update
  8. elseif( $affected == 1 )
  9. $id_insert = $id; // byl insert
  10. else
  11. // blad
kiler129
Tak, ale mysql_affected_rows() to z tego co wiem dodatkowe zapytanie. Inna sprawa, że używam PDO.
Jak się zastanowić te idki potrzbuje tylko jeśli użytkownik zechce coś z wyników dodać do swoich ulubionych w serwisie - wtedy chyba lepiej będzie wyszukać idki najpierw po kluczach uniq (A+cool.gif bo i tak w sumie musiałbym wykonać select przed dodaniem coby sprawdzić czy idki są na pewno prawidłowe.
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.