MySQL - aktualizacja zapytania z limitem

Chcę zaktualizować wiersze w mojej tabeli o zaczynając od 1001 do następnego 1000.

Próbowałem z następującym zapytaniem:

UPDATE `oltp_db`.`users` SET p_id = 3 LIMIT 1001, 1000
  1. to daje mi błąd składni. Czy to prawda? popełniam jakiś błąd.
  2. Czy możemy ograniczyć aktualizację w ten sposób?

Również wiersze, które próbuję zaktualizować, mają wartość Null dla kolumny p_id, która ma typ danych INTEGER. Z tego powodu nie jestem nawet w stanie zaktualizować za pomocą następującego zapytania:

UPDATE `oltp_db`.`users` SET p_id = 3 WHERE p_id = null
  1. jest moim powyższe zapytanie jest poprawne?
  2. co można zrobić, aby to osiągnąć?
Author: srahul07, 2011-06-09

7 answers

Gdy mamy do czynienia z null = nie pasuje do wartości null, które możesz użyć IS NULL lub IS NOT NULL

UPDATE `smartmeter_usage`.`users_reporting` 
SET panel_id = 3 WHERE panel_id IS NULL

LIMIT może być używany z UPDATE, ale tylko z row count

 21
Author: Shakti Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-09 07:58:26

Jeśli chcesz zaktualizować wiele wierszy używając limit w MySQL możesz użyć tego konstruktu:

UPDATE table_name SET name='test'
WHERE id IN (
    SELECT id FROM (
        SELECT id FROM table_name 
        ORDER BY id ASC  
        LIMIT 0, 10
    ) tmp
)
 89
Author: Roopchand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-09 14:31:09

Proponuję zapytanie dwuetapowe

Zakładam, że masz klucz podstawowy autoincrementujący, ponieważ mówisz, że Twój PK to (max+1), co brzmi jak definicja klucza autoincrementującego.
Dzwonię do PK id, zastąp czymkolwiek Twój PK się nazywa.

1-Oblicz główny numer klucza dla kolumny 1000.

SELECT @id:= id FROM smartmeter_usage LIMIT 1 OFFSET 1000

2-Zaktualizuj tabelę.

UPDATE smartmeter_usage.users_reporting SET panel_id = 3 
WHERE panel_id IS NULL AND id >= @id 
ORDER BY id 
LIMIT 1000

Proszę przetestować, aby zobaczyć, czy nie zrobiłem błędu off-by-one; może być konieczne dodanie lub odjęcie 1 gdzieś.

 7
Author: Johan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-04 12:26:23
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 LIMIT 1001, 1000

To zapytanie nie jest poprawne( a przynajmniej nie znam możliwego sposobu użycia limitu w zapytaniach o aktualizację), powinieneś umieścić warunek where na Twoim kluczu głównym (zakłada to, że masz kolumnę auto_increment jako klucz główny, jeśli nie podaj więcej szczegółów):

UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE primary_key BETWEEN 1001 AND 2000

Dla drugiego zapytania należy użyć

UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE panel_id is null

EDIT-jeśli twój primary_key jest kolumną o nazwie MAX+1, zapytanie powinno być (z backsticami podanymi poprawnie w komentarzu):

UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE `MAX+1` BETWEEN 1001 AND 2000

Aby zaktualizować wiersze z maksymalnym + 1 od 1001 do 2000 (w tym 1001 i 2000)

 2
Author: Nicola Peluchetti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-09 09:22:39

Powinieneś użyć IS zamiast = dla porównania z NULL.

UPDATE `smartmeter_usage`.`users_reporting`
SET panel_id = 3
WHERE panel_id IS null

Klauzula LIMIT w MySQL, gdy jest zastosowana do aktualizacji, nie pozwala na podanie offsetu.

 1
Author: Will A,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-09 07:59:15

Powinieneś rozważyć użycie ORDER BY, jeśli zamierzasz ograniczyć aktualizację, ponieważ w przeciwnym razie zaktualizuje się ona w kolejności tabeli, co może nie być poprawne.

Ale jak powie a, pozwala tylko na limit na row_count, a nie offset.

 0
Author: jishi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-09 08:03:23

Można to zrobić z limitem, tylko nie z limitem i offsetem.

 0
Author: user945389,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-11 06:16:08