Forum: PC-Programmierung [MySQL] Update über mehrere Rows


von Rene K. (xdraconix)


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é

von Stephan (Gast)


Lesenswert?

Rene K. schrieb:
> Kann ich ... mit einem einzelnen SQL Statement mehrere Reihen ... updaten?
Klaro.
UPDATE [tabelle] SET [spalte] = [wert] WHERE [whereclause];

von Rene K. (xdraconix)


Lesenswert?

Stephan schrieb:
> UPDATE [tabelle] SET [spalte] = [wert] WHERE [whereclause];

Quasi:
1
UPDATE [tabelle] 
2
  SET [spalte] = [wert] WHERE [ID] = 1;
3
  SET [spalte] = [wert] WHERE [ID] = 2;
4
  SET [spalte] = [wert] WHERE [ID] = 3;

Sicher? Ich probiere das gleich mal aus.

von Stephan (Gast)


Lesenswert?

Rene K. schrieb:
> Sicher? Ich probiere das gleich mal aus.
Scherzkeks?!;)
In jedem SQL Statement gibts natürlich nur eine WHERECLAUSE...

Aber:
1
UPDATE [tabelle] 
2
  SET [spalte] = [wert] 
3
  WHERE [ID] >= 1 AND [ID] <= 3;
ginge natürlich

von Rene K. (xdraconix)


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?

von Ergo70 (Gast)


Lesenswert?


von Rene K. (xdraconix)


Lesenswert?

Ergo70 schrieb:
> Rene K. schrieb:
>> multi=True setzen?
>
> 
https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html

Oh jep, danke :-D Ich habe jetzt die ganze Zeit am MySQL Server 
rumgesucht und nicht in Python.

von 🐧 DPA 🐧 (Gast)


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

von Arbeitslos und Spass dabei (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.