Následující metoda spoléhá na skutečnost, že possessions tabulka má primární klíč a citizen_id není jeho součástí. Tady je nápad:
-
Vložte všechny parametry aktualizace (
citizen_idagood_idpro filtrování nových hodnotcitizen_ida počty řádků k aktualizaci) do nějakého úložiště, možná do vyhrazené tabulky nebo dočasné tabulky. -
Přiřaďte čísla řádků
possessionsrozdělení řádků na(citizen_id, good_id), poté připojte hodnocenou sadu řádků k tabulce parametrů a filtrujte původní celou sadu podlecitizen_idagood_id, stejně jako počet řádků. -
Připojte se k
possessionsa výsledek předchozího spojení hodnot primárního klíče a aktualizacecitizen_ids novými hodnotami.
V SQL MySQL může výše uvedené vypadat takto:
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 je tabulka obsahující hodnoty parametrů.
Dotaz používá známou metodu číslování řádků, která využívá proměnné, která je implementována v f dílčí dotaz.
Nemám MySQL, takže to nemůžu pořádně otestovat z hlediska výkonu, ale alespoň to můžete vidět z toto ukázka SQL Fiddle
že metoda funguje. (Příkaz UPDATE je ve skriptu schématu, protože SQL Fiddle neumožňuje příkazy modifikace dat ve skriptu na pravé straně pro MySQL. Pravá strana pouze vrací obsah possessions po aktualizaci .)