112 votes

MySQL - requête UPDATE avec LIMIT

Je veux mettre à jour les lignes de ma table en commençant par 1001 pour les 1000 suivantes.

J'ai essayé avec la requête suivante :

UPDATE `oltp_db`.`users` SET p_id = 3 LIMIT 1001, 1000
  1. Cela me donne une erreur de syntaxe. Est-ce correct? Est-ce que je fais une erreur ici.
  2. Pouvons-nous limiter la mise à jour de cette manière?

De plus, les lignes que j'essaie de mettre à jour ont une valeur Null pour la colonne p_id qui a un type de données INTEGER. En raison de cela, je ne peux même pas mettre à jour en utilisant la requête suivante :

UPDATE `oltp_db`.`users` SET p_id = 3 WHERE p_id = null
  1. Ma requête ci-dessus est-elle correcte?
  2. Que pouvons-nous faire pour y parvenir?

178voto

Roopchand Points 686

Si vous voulez mettre à jour plusieurs lignes en utilisant la limite dans MySQL, vous pouvez utiliser cette structure :

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
)

33voto

Framework Points 32799

Lorsqu'il s'agit de null, = ne correspond pas aux valeurs null. Vous pouvez utiliser IS NULL ou IS NOT NULL

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

LIMIT peut être utilisé avec UPDATE mais seulement avec le row count

19voto

Jerry Points 1271

En plus de l'approche imbriquée ci-dessus, vous pouvez effectuer l'application de la balise LIMIT en utilisant la balise JOIN sur la même table:

UPDATE `table_name`
INNER JOIN (SELECT `id` from `table_name` order by `id` limit 0,100) as t2 using (`id`)
SET `name` = 'test'

Dans mon expérience, l'optimiseur de requête mysql est plus satisfait avec cette structure.

12voto

Johan Points 34755

Je suggérerais une requête en deux étapes

Je suppose que vous avez une clé primaire auto-incrémentée car vous dites que votre clé primaire est (max+1) ce qui ressemble à la définition d'une clé auto-incrémentée.
Je nomme la clé primaire id, remplacez par le nom de votre clé primaire.

1 - déterminez le numéro de clé primaire pour la colonne 1000.

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

2 - mettez à jour la table.

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

Veuillez tester pour voir si je n'ai pas commis d'erreur d'un quelconque décalage; vous pourriez avoir besoin d'ajouter ou de soustraire 1 quelque part.

4voto

Nicola Peluchetti Points 38948
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 LIMIT 1001, 1000

Cette requête n'est pas correcte (ou du moins je ne connais pas de moyen possible d'utiliser la limite dans les requêtes UPDATE), vous devriez mettre une condition where sur votre clé primaire (cela suppose que vous avez une colonne auto_increment comme clé primaire, si ce n'est pas le cas, veuillez fournir plus de détails) :

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

Pour la deuxième requête, vous devez utiliser IS

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

EDIT - si votre primary_key est une colonne nommée MAX+1 votre requête devrait être (avec des backticks comme indiqué correctement dans le commentaire) :

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

Pour mettre à jour les lignes avec MAX+1 de 1001 à 2000 (y compris 1001 et 2000)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X