[MySQL] Update über mehrere Rows

OP #6970839
Lesenswert?
• ▲
▼
Eine Frage:

Ich habe mehrere Datensätze, welche zeitgleich anliegen und in der 
Datenbank geändert werden können. Momentan macht das Programm folgendes 
für jeden einzelnen Datensatz:

- Datenbankinstanz erzeugen
- Datenbank öffnen
- SQL String erzeugen
- SQL in die Datenbank schreiben
- Datenbank commiten
- Datenbank schließen
- Datenbankinstanz schließen

Kann ich, so wie es auch bei einem Insert funktioniert, mit einem 
einzelnen SQL Statement mehrere Reihen anhand ihres primären Schlüssels 
updaten?

Oder bin ich gezwungen jeden Datensatz einzeln zu ändern?

Liebe Grüße René
OP #6970889
Lesenswert?
• ▲
▼
Aktuell sieht der Syntax dann wie folgt aus:
1
UPDATE Relais 
2
  SET Status = 1 WHERE id = 1,
3
  SET Status = 1 WHERE id = 2,
4
  SET Status = 0 WHERE id = 3,
5
  SET Status = 1 WHERE id = 4,
6
  SET Status = 0 WHERE id = 5,
7
  SET Status = 0 WHERE id = 6,
8
  SET Status = 0 WHERE id = 7,
9
  SET Status = 0 WHERE id = 8;

da wirft er mir einen Syntaxfehler aus, geht jedoch nicht näher auf den 
Fehler ein.

Mache ich jedes UPDATE Statement einzeln in einer gemeinsamen Query:
1
UPDATE Relais SET Status = 1 WHERE id = 1;
2
UPDATE Relais SET Status = 1 WHERE id = 2;
3
UPDATE Relais SET Status = 0 WHERE id = 3;
4
UPDATE Relais SET Status = 1 WHERE id = 4;
5
UPDATE Relais SET Status = 0 WHERE id = 5;
6
UPDATE Relais SET Status = 0 WHERE id = 6;
7
UPDATE Relais SET Status = 0 WHERE id = 7;
8
UPDATE Relais SET Status = 0 WHERE id = 8;

Wirft er folgenden Fehler:
1
mysql.connector.errors.InterfaceError: Use cmd_query_iter for statements with multiple queries.
2

3

4
# und:
5

6
mysql.connector.errors.InterfaceError: Use multi=True when executing multiple statements

aber wie und wo kann ich dann cmd_query_iter oder multi=True setzen?
Gast #6970916
Lesenswert?
• ▲
▼
Wozu das ganze denn? Was ist das Problem, mehrere UPDATE Statements 
anzugeben?

- Datenbank öffnen
- INSERT / UPDATE statement absetzen
- INSERT / UPDATE statement absetzen
- INSERT / UPDATE statement absetzen
- Datenbank schließen

Sollte problemlos gehen. Oder willst du was anderes machen?

Willst du eventuell sicherstellen, das alle Inserts funktionieren oder 
fehlschlagen, und nie nur ein paar? Da kannst du Transactions nehmen.

Willst du eventuell stattdessen mehrere Zeilen ändern? Dann einfach alle 
beim SET angeben.

Willst du bei mehreren IDs ein Feld gleich setzen? Dann kannst du ganz 
normal "UPDATE x SET y=z WHERE id in (1,2,3,...)" machen.

Willst du Updates machen, wenn ein insert nicht geht, weil ein Eintrag 
nicht da ist? Dann nimm "INSERT ... ON DUPLICATE KEY UPDATE ..."

Hast du daten von einer anderen Tabelle, anhand derer du inserts oder 
updates machen willst? Dann kannst du "insert into" nehmen.

Willst du beim Update daten checken oder ändern? Dann nimm einen 
Trigger.

Rene K. schrieb:
> - SQL String erzeugen
> - SQL in die Datenbank schreiben

Ich hoffe "SQL String erzeugen" ist ein prepared statement. Das 
verhindert Fehler, und da ist es auch einfacher, beliebige Daten beim 
absetzen des Query mitzugeben: 
https://dev.mysql.com/doc/apis-php/en/apis-php-mysqli.quickstart.prepared-statements.html
Gast #6970950
Lesenswert?
• ▲
▼
1 EINE Verbindung öffnen
2 Updates raushauen
3 wenn fertig und kein Fehler : commiten
4 Verbindung schliessen.

Das ist schneller als jedes einzelne Statement zu comitten und dann auch 
noch die Verbindung wieder neu aufzumachen, das frisst massiv 
Performance bei vielen Updates.

Evt. auch an einen Lock denken wenn da andere noch drauf rumwerkeln.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.