web-dev-qa-db-fra.com

MySQL - Requête UPDATE avec LIMIT

Je souhaite mettre à jour les lignes de ma table à partir de 1001 à 1000.

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. Peut-on limiter la mise à jour de cette manière?

De plus, les lignes que je tente de mettre à jour ont une valeur Null pour la colonne p_id qui contient le type de données INTEGER. Pour cette raison, je ne suis même pas capable de 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 peut-on faire pour y parvenir?
56
srahul07

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 avec le row count seulement

24
Shakti Singh

Si vous souhaitez mettre à jour plusieurs lignes en utilisant limit dans MySQL, vous pouvez utiliser cette construction:

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
)
104
Roopchand

Je suggère une requête en deux étapes

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

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

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

2 - mettre à jour le tableau.

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

S'il vous plaît, testez pour voir si je n'ai pas commis d'erreur par un; vous devrez peut-être ajouter ou soustraire 1 quelque part.

8
Johan
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 le moyen possible d’utiliser limit dans les requêtes UPDATE), vous devez mettre une condition where sur votre clé primaire (cela suppose que vous avez une colonne auto_increment clé primaire, si non 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, vous devez interroger (avec les backticks correctement définis 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)

3

Vous pouvez le faire avec une limite, mais pas avec une limite et un décalage.

2
user945389

Vous devriez utiliser IS plutôt que = pour comparer à NULL.

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

La clause LIMIT de MySQL, lorsqu'elle est appliquée à une mise à jour, ne permet pas de spécifier un décalage.

1
Will A

En plus de l'approche imbriquée ci-dessus, vous pouvez effectuer l'application de LIMIT à l'aide de 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'

D'après mon expérience, l'optimiseur de requêtes mysql est plus heureux avec cette structure.

1
Jerry

Pour les gens obtenir ce poste par la recherche "update limit MySQL" en essayant d'éviter d'éteindre le safe update mode lorsque update est confronté à la syntaxe à plusieurs tables.

Depuis le document officiel état

Pour la syntaxe à plusieurs tables, UPDATE met à jour les lignes de chaque table nommée dans les références de table qui satisfont aux conditions. Dans ce cas, ORDER BY et LIMIT ne peuvent pas être utilisés.

https://stackoverflow.com/a/28316067/1278112
Je pense que cette réponse est très utile. Il donne un exemple

METTRE À JOUR les clients SET countryCode = 'USA' WHERE country = 'USA'; - ce qui donne l'erreur, vous écrivez juste:

METTRE À JOUR les clients SET countryCode = 'USA' WHERE (pays = 'USA' ET ClientNuméro <> 0); - Parce que customerNumber est une clé primaire, vous n’avez plus l’erreur 1175.

Ce que je veux mais soulèverais le code d'erreur 1175.

UPDATE table1 t1
        INNER JOIN
    table2 t2 ON t1.name = t2.name 
SET 
    t1.column = t2.column
WHERE
    t1.name = t2.name;

L'édition de travail

UPDATE table1 t1
        INNER JOIN
    table2 t2 ON t1.name = t2.name 
SET 
    t1.column = t2.column
WHERE
    (t1.name = t2.name and t1.prime_key !=0);

Ce qui est vraiment simple et élégant. Étant donné que la réponse initiale ne suscite pas beaucoup d'attention (votes), je poste plus d'explications. J'espère que cela peut aider les autres.

0
Shihe Zhang

Vous devriez fortement envisager d'utiliser un ORDER BY _ si vous avez l'intention de LIMITER votre UPDATE, sinon elle sera mise à jour dans l'ordre de la table, ce qui pourrait ne pas être correct.

Mais comme l'a dit A, cela ne permet de limiter que row_count, pas offset.

0
jishi