22 Stimmen

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?

AntwortenPositivNegativDatumStimmen
2Beste Antwort4 Stimmen

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:

UPDATE OR INSERT INTO tab (id, val) 
  VALUES (10, 1);

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:

UPDATE OR INSERT INTO tab (id, val) 
  VALUES (10, 1) 
  MATCHING(id);

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

AntwortenPositiv Negativ
11 Stimme

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

Positiv Negativ
Antworten
Antworten

Ähnliche Themen

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.