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_id
igood_id
filtrować, nowe wartościcitizen_id
i liczbę wierszy do zaktualizowania) do jakiejś pamięci, być może dedykowanej tabeli lub tabeli tymczasowej. -
Przypisz numery wierszy do
possessions
partycjonowanie 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_id
igood_id
, a także liczbę rzędów. -
Dołącz do
possessions
i wynik poprzedniego sprzężenia dla wartości klucza podstawowego i zaktualizujcitizen_id
z 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 .)