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é
Rene K. schrieb: > Kann ich ... mit einem einzelnen SQL Statement mehrere Reihen ... updaten? Klaro. UPDATE [tabelle] SET [spalte] = [wert] WHERE [whereclause];
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.
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
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?
Rene K. schrieb: > multi=True setzen? https://dev.mysql.com/doc/connector-python/en/connector-python-api-mysqlcursor-execute.html
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.