Firebird: INSERT mit ON DUPLICATE KEY UPDATE
Frage von PC Control | Letztes Update am 01.11.2023 | Erstellt am 09.07.2017
Ich möchte einige Daten in eine Firebird-Datenbank entweder neu einfügen oder falls die entsprechende ID bereits existiert, den Datensatz mit dieser ID updaten. Dies würde ich gerne innerhalb von einer Abfrage tun, damit ich keine Fehlermeldungen bekomme und nicht jedes Mal zuerst überprüfen muss, ob eine ID schon in der Tabelle ist.
Für diese Zwecke gibt es in MySQL den Befehl "INSERT ... ON DUPLICATE KEY UPDATE", den man in folgender Weise formuliert:
INSERT INTO tab (id, val) VALUES (10, 1) ON DUPLICATE KEY UPDATE val = val + 1;
Damit wird ein Eintrag mit id = 10 und val = 1 in die Tabelle "tab" neu eingetragen, falls es die id = 10 noch nicht gibt. Falls es diese ID bereits gibt, wird der Wert von val dieser Zeile dagegen um 1 erhöht.
Genau das würde ich gerne nun auch mit Firebird machen. Leider scheint Firebird diese Syntax aber nicht zu verstehen und gibt mir immer nur eine Fehlermeldung aus. Was kann ich tun? Gibt es diese Möglichkeit nicht in Firebird?
Ähnliche Themen
MySQL: Zeilenumbrüche in MySQL
Tipp | 0 Kommentare
XAMPP: SSL/HTTPS für lokale Projekte einrichten
Tutorial | 8 Kommentare
MySQL/PHP: ID vom letzten INSERT auslesen
Info | 0 Kommentare
Firebird: SELECT mit LIMIT
Frage | 1 Antwort
MySQL: Aktuelles Datum oder Zeit in Spalte schreiben
Tutorial | 0 Kommentare
Delphi/Lazarus: Nur Zahlen im Edit-Feld erlauben
Tipp | 0 Kommentare
Delphi/Lazarus: Ist die ALT, SHIFT oder STRG-Taste gedrückt?
Tutorial | 0 Kommentare
Wichtiger Hinweis
Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.
Jetzt mitmachen
Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.
Doch, auch in Firebird kannst du ein "ON DUPLICATE KEY UPDATE"-INSERT durchführen. Allerdings ist in Firebird die Syntax etwas anders. Statt der MySQL-Syntax, musst du "UPDATE OR INSERT" schreiben.
Deine Abfrage von oben würde entsprechend folgendermaßen in Firebird aussehen:
Die "UPDATE OR INSERT"-Query von Firebird nutzt automatisch die vorhandenen Spalte(n) mit PRIMARY KEY. Wenn du keine "PRIMARY KEY"-Spalte hast oder andere Spalten für den Match verwenden möchtest, kannst du das Keyword MATCHING verwenden und hinten anstellen:
Hinter MATCHING in der Klammer definierst du, welche Spalten für die Übereinstimmung benutzt werden sollen. In diesem Beispiel habe ich wieder die Spalte "id" genommen um deinem Beispiel zu entsprechen.
Mehr zu diesem Thema findest du auch in der Firebird-FAQ.
Letztes Update am 01.11.2023 | Erstellt am 10.07.2017
Wenn man sich die Firebird-FAQ dazu anschaut gibt es aber eine kleine Abweichung von der ursprünglichen Problemstellung:
PC Control wollte bei bereits vorhandener id den Wert von val um 1 erhöhen.
Mit dem "UPDATE OR INSERT" Statement würde der bisherige Wert von val jedoch schlicht mit dem neuen ersetzt (wird in dem Beispiel sehr deutlich wie es vor Version 2.1 gemacht wurde).
Das Erhöhen von val um den Wert aus dem neuen Datensatz fällt eher unter den Schlusshinweis "Furthermore, if you need some more complex logic, you can also use the MERGE statement".
12.02.2020 um 22:43