Ich möchte die Zeilen in meiner Tabelle von 1001 bis 1000 aktualisieren.
Ich habe es mit folgender Abfrage versucht:
UPDATE `oltp_db`.`users` SET p_id = 3 LIMIT 1001, 1000
- Dies gibt mir einen Syntaxfehler. Ist das richtig? mache ich hier einen Fehler
- Können wir das Update auf diese Weise einschränken?
Außerdem haben die Zeilen, die ich aktualisieren möchte, den Wert Null für die Spalte p_id mit dem Datentyp INTEGER. Aus diesem Grund kann ich nicht einmal mit folgender Abfrage aktualisieren:
UPDATE `oltp_db`.`users` SET p_id = 3 WHERE p_id = null
- Ist meine obige Abfrage korrekt?
- Was kann getan werden, um dies zu erreichen?
mysql
limit
sql-update
Rahul Shelke
quelle
quelle
=
auf Gleichheit zweier Werte prüfen. Daher=
stimmt nicht mit null überein.row count
nicht funktioniert für MySQL Version 5.1.XWenn Sie mehrere Zeilen mithilfe von limit in MySQL aktualisieren möchten, können Sie dieses Konstrukt verwenden:
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 )
quelle
SELECT id FROM (SELECT id FROM ...)
Konstrukt) erhalte ichERROR 1235 (42000): This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
, aber wenn ich beide Auswahlen wie hier gezeigt einbinde , funktioniert die Abfrage.SELECT id FROM (
… benötigt wird) tmp
. Vielen Dank. Scheint so, als ob dies die akzeptierte Antwort sein sollte.Ich würde eine zweistufige Abfrage vorschlagen
Ich gehe davon aus, dass Sie einen automatisch inkrementierenden Primärschlüssel haben, weil Sie sagen, dass Ihre PK (max + 1) ist, was wie die Definition eines automatisch inkrementierenden Schlüssels klingt.
Ich rufe die PK an
id
, ersetze sie durch die , die deine PK heißt.1 - Ermitteln Sie die Primärschlüsselnummer für Spalte 1000.
SELECT @id:= id FROM smartmeter_usage LIMIT 1 OFFSET 1000
2 - Aktualisieren Sie die Tabelle.
UPDATE smartmeter_usage.users_reporting SET panel_id = 3 WHERE panel_id IS NULL AND id >= @id ORDER BY id LIMIT 1000
Bitte testen Sie, ob ich keinen Fehler gemacht habe. Möglicherweise müssen Sie irgendwo 1 addieren oder subtrahieren.
quelle
Zusätzlich zu dem oben beschriebenen verschachtelten Ansatz können Sie die Anwendung der
LIMIT
VerwendungJOIN
in derselben Tabelle ausführen:UPDATE `table_name` INNER JOIN (SELECT `id` from `table_name` order by `id` limit 0,100) as t2 using (`id`) SET `name` = 'test'
Nach meiner Erfahrung ist der MySQL-Abfrageoptimierer mit dieser Struktur zufriedener.
quelle
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 LIMIT 1001, 1000
Diese Abfrage ist nicht korrekt (oder zumindest kenne ich keine Möglichkeit, Limit in UPDATE-Abfragen zu verwenden). Sie sollten eine
where
Bedingung für Ihren Primärschlüssel festlegen (dies setzt voraus, dass Sie eine auto_increment-Spalte als Primärschlüssel haben, falls nicht angegeben mehr Details):UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE primary_key BETWEEN 1001 AND 2000
Für die zweite Abfrage müssen Sie IS verwenden
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE panel_id is null
BEARBEITEN - Wenn Ihr Primärschlüssel eine Spalte mit dem Namen MAX + 1 ist, die Sie abfragen sollten (mit Backticks, wie im Kommentar korrekt angegeben):
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE `MAX+1` BETWEEN 1001 AND 2000
So aktualisieren Sie die Zeilen mit MAX + 1 von 1001 auf 2000 (einschließlich 1001 und 2000)
quelle
max + 1 between 1001 and 2000
sollte umgeschrieben werdenmax between 1000 and 1999
. (C) Ich habe noch nie von einem Primärschlüssel gehörtmax+1
, der keinen Sinn ergibt. (D) Dieser Code geht davon aus, dass die Spaltemax
kontinuierlich ist, was in keiner Weise garantiert wird. (E) Limit funktioniert mitupdate
.Sie können dies mit einem LIMIT tun, nur nicht mit einem LIMIT und einem OFFSET.
quelle
Sie sollten IS anstelle von = für den Vergleich mit NULL verwenden.
UPDATE `smartmeter_usage`.`users_reporting` SET panel_id = 3 WHERE panel_id IS null
Die
LIMIT
Klausel in MySQL, die auf ein Update angewendet wird, erlaubt keine Angabe eines Offsets.quelle
Sie sollten in Betracht ziehen, ein zu verwenden,
ORDER BY
wenn Sie Ihr UPDATE BEGRENZEN möchten, da es sonst in der Reihenfolge der Tabelle aktualisiert wird, was möglicherweise nicht korrekt ist.Aber wie Will A sagte, erlaubt es nur die Begrenzung von row_count, nicht den Offset.
quelle
Für Leute erhalten Sie diesen Beitrag durch die Suche "Update Limit MySQL" versuchen, das Ausschalten zu vermeiden,
safe update mode
wenn Sieupdate
mit der Syntax für mehrere Tabellen konfrontiert sind .Seit dem offiziellen Dokument Zustand
https://stackoverflow.com/a/28316067/1278112
Ich denke, diese Antwort ist sehr hilfreich. Es gibt ein Beispiel
Was ich will, würde aber den Fehlercode 1175 auslösen.
UPDATE table1 t1 INNER JOIN table2 t2 ON t1.name = t2.name SET t1.column = t2.column WHERE t1.name = t2.name;
Die Arbeitsausgabe
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);
Welches ist wirklich einfach und elegant. Da die ursprüngliche Antwort nicht zu viel Aufmerksamkeit erhält (Stimmen), poste ich weitere Erklärungen. Hoffe das kann anderen helfen.
quelle