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
- to daje mi błąd składni. Czy to prawda? popełniam jakiś błąd.
- 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
- jest moim powyższe zapytanie jest poprawne?
- co można zrobić, aby to osiągnąć?
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
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
)
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ś.
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)
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.
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.
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.
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