Poniższa metoda opiera się na fakcie, że possessions tabela ma klucz podstawowy i citizen_id nie jest jego częścią. Oto pomysł:
-
Umieść wszystkie parametry aktualizacji (
citizen_idigood_idfiltrować, nowe wartościcitizen_idi liczbę wierszy do zaktualizowania) do jakiejś pamięci, być może dedykowanej tabeli lub tabeli tymczasowej. -
Przypisz numery wierszy do
possessionspartycjonowanie wierszy na(citizen_id, good_id), a następnie połącz uszeregowany zestaw wierszy z tabelą parametrów, aby odfiltrować oryginalny pełny zestaw nacitizen_idigood_id, a także liczbę rzędów. -
Dołącz do
possessionsi wynik poprzedniego sprzężenia dla wartości klucza podstawowego i zaktualizujcitizen_idz nowymi wartościami.
W SQL MySQL powyższe może wyglądać tak:
UPDATE possessions AS p
INNER JOIN
(
SELECT
@r := @r * (@c = p.citizen_id AND @g = p.good_id) + 1 AS r,
p.possession_id,
@c := p.citizen_id AS citizen_id,
@g := p.good_id AS good_id
FROM
possessions AS p
CROSS JOIN
(SELECT @r := 0, @c := 0, @g := 0) AS x
ORDER BY
p.citizen_id,
p.good_id
) AS f ON p.possession_id = f.possession_id
INNER JOIN
possession_updates AS u ON u.citizen_id = f.citizen_id AND u.good_id = f.good_id
SET
p.citizen_id = u.new_citizen_id
WHERE
f.r <= u.row_count
;
possessions_update to tabela zawierająca wartości parametrów.
Zapytanie używa znanej metody numerowania wierszy, która wykorzystuje zmienne, która jest zaimplementowana w f podzapytanie.
Nie mam MySQL, więc nie mogę tego poprawnie przetestować z punktu widzenia wydajności, ale przynajmniej możesz to zobaczyć z to demo SQL Fiddle
że metoda działa. (Instrukcja UPDATE znajduje się w skrypcie schematu, ponieważ SQL Fiddle nie zezwala na instrukcje modyfikacji danych w skrypcie po prawej stronie dla MySQL. Prawa strona po prostu zwraca zawartość possessions po aktualizacji .)