sql >> Databáze >  >> RDS >> Mysql

Dávkové dotazy MySQL s limitem

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:

  1. Vložte všechny parametry aktualizace (citizen_id a good_id pro filtrování nových hodnot citizen_id a počty řádků k aktualizaci) do nějakého úložiště, možná do vyhrazené tabulky nebo dočasné tabulky.

  2. 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 podle citizen_id a good_id , stejně jako počet řádků.

  3. Připojte se k possessions a výsledek předchozího spojení hodnot primárního klíče a aktualizace citizen_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 .)




  1. Vložení hodnoty zakódované do JSON se speciálními znaky do mySQL se nezdaří

  2. Vyberte prvních 150 řádků, pak dalších 150 a tak dále?

  3. MariaDB SYSTEM_USER() vysvětleno

  4. Úvod k balíčkům PL/SQL v databázi Oracle