Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytania wsadowe MySQL z limitem

Poniższa metoda opiera się na fakcie, że possessions tabela ma klucz podstawowy i citizen_id nie jest jego częścią. Oto pomysł:

  1. Umieść wszystkie parametry aktualizacji (citizen_id i good_id filtrować, nowe wartości citizen_id i liczbę wierszy do zaktualizowania) do jakiejś pamięci, być może dedykowanej tabeli lub tabeli tymczasowej.

  2. 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 na citizen_id i good_id , a także liczbę rzędów.

  3. Dołącz do possessions i wynik poprzedniego sprzężenia dla wartości klucza podstawowego i zaktualizuj citizen_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 .)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak zabezpieczyć MySQL:część pierwsza

  2. Porównywanie ciągów, z których jeden ma wcześniej puste spacje, a drugi nie

  3. Poprawa wydajności MySQL dzięki zaawansowanym ustawieniom InnoDB

  4. Porównywanie ciągów znaków w PHP w taki sam sposób, jak robi to MySQL

  5. MySQL INSERT, jeśli nie istnieje (nie używa klucza podstawowego)