Klassiker : Insert if not exists...

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

Antworten
Groffy
Beiträge: 8
Registriert: Do 12. Apr 2018, 23:14

Mi 18. Apr 2018, 17:55

Hallo Zusammen,

in einem anderen Forum (Lazarus/Object Pascal) bin ich in eine Diskussion eingestiegen zu der Frage, wie man einen Datensatz nur dann einfügt wenn dieser noch nicht existiert. Alles in einem DSQL Statement :-)

Eine Syntax im einem if statement funktioniert nur in PSQL, folgende Vorschläge wurden gemacht :

Code: Alles auswählen

INSERT INTO Tablename (Fieldname1l, Fieldname2)
SELECT :Fieldname1l, :Fieldname2
FROM rdb$database
WHERE NOT EXISTS (SELECT 1 FROM Tablename WHERE Fieldname1l = :Fieldname1l)
und mein Vorschlag :

Code: Alles auswählen

update or insert into Tablename(Fieldname1l, Fieldname2) values ( :Fieldname1l, :Fieldname2) matching (:Fieldname1l)
wobei aber immer ein update ausgeführt wird falls der Datensatz schon existiert,

Es ginge auch noch über ein EXECUTE BLOCK und einem darin enthaltenen PSQL statement habe aber so etwas noch nicht benutzt.


Bietet Firebird da noch andere Lösungen für an?

Gruß Ulrich
martin.kerkhoff
Beiträge: 4
Registriert: Di 10. Apr 2018, 10:50

Do 19. Apr 2018, 09:19

Guten Morgen

vielleicht ist das ja ein Ansatz.

Code: Alles auswählen

MERGE INTO customers c
  USING (SELECT * from customers_delta WHERE id > 10) cd
  ON (c.id = cd.id)
  WHEN MATCHED THEN
    UPDATE SET name = cd.name
  WHEN NOT MATCHED THEN
    INSERT (id, name) values (cd.id, cd.name)
das "WHEN MATCHED" kann man weglassen
Über Performance kann ich nichts sagen, ein Test würde sich da schon m.E. lohnen

schönen, sonnigen Tag
Martin Kerkhoff

DECON
Martin Kerkhoff & Stefan Barufke GbR
Groffy
Beiträge: 8
Registriert: Do 12. Apr 2018, 23:14

Sa 21. Apr 2018, 22:30

Hallo Martin,

ja danke - die Lösung gefällt mir persönlich am besten. Ich muss gestehen, ich habe mich bislang noch nicht wirklich mit den Möglichkeiten des Merge Statements auseinandergesetzt.

Beste Grüße - Ulrich
bfuerchau
Beiträge: 117
Registriert: Mo 7. Mai 2018, 18:09

Mo 7. Mai 2018, 18:16

Also der Merge ist da schon sehr performant, denn man kann alles in genau 1 Statement packen.
Man bedenke, dass man ansonsten ja 2 SQL's Richtung Server schicken muss, erst den Select und dann wahlweise Insert oder Update.
Ich benutze den i.Ü. sehr gerne.
Antworten