0 0 Stimmen

Firebird: INSERT mit ON DUPLICATE KEY UPDATE

Frage von PC Control | 09.07.2017 um 22:10 Uhr

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 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 gibt, wird der Wert von val dieser Zeile um 1 erhöht.

Genau das würde ich gerne nun 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

NetGuy

Profil anzeigen | Nachricht
Avatar
0Beste Antwort
2 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" 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.

Mehr zu diesem Thema findest du auch in der Firebird-FAQ.
10.07.2017 um 22:42 Uhr

AntwortenPositiv Negativ
00 Stimmen

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 Uhr

Positiv Negativ
Antworten

Ähnliche Themen

Wichtiger Hinweis

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.