2011-06-09 16 views
44

Chcę zaktualizować wiersze w moim stole począwszy od 1001 do następnego 1000.MySQL - zapytanie UPDATE z LIMIT

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 jest poprawne? czy tu robię jakiś błąd.
  2. Czy możemy w ten sposób ograniczyć aktualizację?

Ponadto wiersze, które próbuję aktualizować, mają wartość Null dla kolumny p_id, która ma typ danych INTEGER. Z tego powodu nie jestem nawet w stanie zaktualizować przy użyciu następujące zapytanie:

UPDATE `oltp_db`.`users` SET p_id = 3 WHERE p_id = null 
  1. Czy mój Powyższe zapytanie prawidłowe?
  2. Co można zrobić, aby to osiągnąć?

Odpowiedz

19

Gdy mamy do czynienia z wartością null = nie odpowiada wartości null można 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 z row count tylko

+0

Dziękuję za odpowiedź. Czy możesz dać mi wgląd w to, dlaczego IS NULL różni się od = null. Również. co dokładnie IS NULL robi, aby znaleźć wartości null? – srahul07

+2

@ srahul07: Ponieważ NULL nie jest wartością rzeczywistą i '=' sprawdź równość dwóch wartości. Dlatego '=' nie pasuje do wartości null. –

+0

@Framework, aktualizacja limitu z 'liczbą wierszy' nie działa dla mysql w wersji 5.1.X –

0

należy używać raczej than = dla porównania z NULL.

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

Klauzula w MySQL LIMIT gdy stosowane do aktualizacji nie dopuszcza przesunięcie zostać określona.

+0

Pomogło mi to w podobnej, ale innej sytuacji - zapytanie powinno mieć wartość" update my_table set process_id = n limit 1000 "zamiast" update my_table set " process_id = n limit 0,1000 " – rrrhys

2
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 LIMIT 1001, 1000 

To zapytanie nie jest poprawna (a przynajmniej nie wiem możliwy sposób wykorzystania limitu w zapytaniach update), należy postawić warunek where na ciebie klucz podstawowy (zakładając, że masz kolumnę auto_increment jako klucz podstawowy, jeśli nie dostarczają więcej informacji):

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

na drugim zapytaniu należy użyć, jest

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

EDIT - jeśli primary_key to kolumna o nazwie MAX + 1 Państwo zapytanie powinno być (z backticks jak słusznie stwierdził w komentarzu):

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

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

+2

Przyjmujesz założenie, że ma on auto_increment na stole, co może nie być prawdą, ani nie musi być nieprzerwaną serią liczb. – jishi

+0

cóż, tak, oczywiście, robię to założenie, będę aktualizować odpowiedź z tym, czekając na więcej informacji! :) –

+0

Dziękuję za odpowiedź. Właściwie klucz podstawowy to MAX + 1. – srahul07

0

Należy bardzo rozważyć użycie ORDER BY jeśli zamierzasz OGRANICZYĆ AKTUALIZACJĘ, ponieważ w przeciwnym razie aktualizacja zostanie zaktualizowana w kolejnosci tabeli, co może nie być poprawne.

Ale zgodnie z wolą A, dopuszcza ona tylko limit na count_count, a nie offset.

7

Proponuję zapytanie dwuetapowe

Ja zakładając masz Autoinkrementacja klucz podstawowy, ponieważ można powiedzieć swoją PK (max + 1), który brzmi jak definicja klucza autioincrementing.
Dzwonię do PK id, zastępuję czymkolwiek jest twój PK.

1 - dowiedzieć się numer klucza podstawowego dla kolumny 1000.

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

2 - zaktualizować tabelę.

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

Proszę sprawdzić, czy nie popełniłem błędu "jeden po drugim"; może być konieczne dodanie lub odjęcie 1 gdzieś.

74

jeśli chcesz zaktualizować wiele wierszy z wykorzystaniem limitu w mysql ... to wykorzystać

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 
    ); 
+15

MySQL 5.5 nie obsługuje LIMIT w podsystemie IN/ALL/ANY/SOME: Kod błędu 1235 – FiveO

+5

@FiveO Działa dobrze dla mnie na MySQL 5.5.34. Bez zagnieżdżonego podkwerendy (perwersyjny 'SELECT id FROM (SELECT id from ...)' construct) otrzymuję 'ERROR 1235 (42000): Ta wersja MySQL jeszcze nie obsługuje 'LIMIT i IN/ALL/ANY/SOME subquery'', ale jeśli uwzględnię oba selekcje, jak pokazano tutaj, zapytanie działa. –

+2

To działa, ale nie mogę zrozumieć, dlaczego to działa:/ – Vertig0