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_id
agood_id
pro filtrování nových hodnotcitizen_id
a 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ů
possessions
rozdělení řádků na(citizen_id, good_id)
, poté připojte hodnocenou sadu řádků k tabulce parametrů a filtrujte původní celou sadu podlecitizen_id
agood_id
, stejně jako počet řádků. -
Připojte se k
possessions
a výsledek předchozího spojení hodnot primárního klíče a aktualizacecitizen_id
s 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 .)