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
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
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
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
)
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.
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)
Vous pouvez le faire avec une limite, mais pas avec une limite et un décalage.
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.
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.
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.
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.