![]() |
Datenbank: Firebird • Version: 2.5.2 • Zugriff über: UniDAC
Update & Insert getrennt manuell ausführen oder eine Stored Procedure ?
Hallo zusammen,
ich habe eine Tabelle mit 8 Spalten. Der Primary Key liegt auf Spalte 4. Jetzt muss ich in regelmäßigen Abständen neue Daten hinzufügen oder bestehende Daten updaten. Als erste Idee hatte ich, den befehl UPDATE OR INSERT zu nutzen. Da gibt es nur ein Problem, bei einem Update darf die Spalte 7 nicht verändert werden. Also fällt ja der Befehl UPDATE OR INSERT weg, nach meinen Wissensstand. Als letzte Möglichkeit fällt mit nur noch eine Stored Procedure ein, die die entsprechenden Regeln verwaltet und dann das Update oder den Insert ausführt. Habe ich jetzt noch eine Möglichkeit übersehen oder gibt es noch eine andere ? Oder gibt es für den Befehl UPDATE OR INSERT eine Option, wo ich eine Spalte weglassen oder hinzfügen kann ? |
AW: Update & Insert getrennt manuell ausführen oder eine Stored Procedure ?
Und bei "update or insert" hilft dir die Matching-Funktion nicht weiter?
Ist dein Primärschlüssel ein künstlicher Schlüssel? Hast du in einer anderen Spalte einen natürlichen Schlüssel, der den Datensatz ebenfalls identifiziert? (z.B. ArtikelNr) Dann dürfte "Matching ArtikelNr" dir helfen |
AW: Update & Insert getrennt manuell ausführen oder eine Stored Procedure ?
Schau da
![]() Merge sollte beide Fälle deckeln. |
AW: Update & Insert getrennt manuell ausführen oder eine Stored Procedure ?
Wenn es nicht auf maximale Geschwindigkeit ankommt, dann kann man deine Anforderung sehr flexibel mit Delphi-Code lösen:
Delphi-Quellcode:
query.SQL.Tet := 'SELECT * FROM Tabelle WHERE keyfeld=:keyfeld';
query.parameters.ParamValues['keyfeld'] := ...; // muss ggf. an Zugriffskomponente angepasst werden query.Open; if query.IsEmpty then begin // neuen Datensatz einfügen query.Append; // hier alle Felder beschreiben, die nur beim INSERT befüllt werden müssen query['keyfeld'] := ...; query['Spalte7'] := ...; end else begin // bestehenden Datensatz ändern query.Edit; // hier alle Felder beschreiben, die nur beim UPDATE geändert werden müssen query['AnzahlModifikationen'] := query['AnzahlModifikationen'] + 1; end; // hier alle Felder befüllen, die sowohl beim INSERT als auch beim UPDATE geschrieben werden query['Feld1'] := ...; query['Feld2'] := ...; query.Post; // Datensatz schreiben, im Hintergrund wird ein INSERT oder UPDATE generiert und abgeschickt |
AW: Update & Insert getrennt manuell ausführen oder eine Stored Procedure ?
Hallo zusammen,
danke für eure Antworten. Der Befehl MERGE sieht wirklich nachdem aus, womit ich beide Varianten abdecken kann. Ich werde das jetzt mal ausprobieren. |
AW: Update & Insert getrennt manuell ausführen oder eine Stored Procedure ?
Ich würde die Funktion in einer Stored Procedure kapseln, denn deine Business Logic besagt an der Stelle, das (zumindest) Spalte #7 nicht verändert werden darf.
Später kommen vielleicht noch mehr Regeln dazu, die vielleicht auch dazu führen, das man mit einem MERGE nicht mehr weiter kommt. |
AW: Update & Insert getrennt manuell ausführen oder eine Stored Procedure ?
@Furtbichler,
ich persönlich nutze MERGE für FireBird oder das "ON DUPLICATED KEY" Event für MariaDB etc. relativ häufig. IMHO spricht nichts dagegen das beschriebene Problem in eine StoredProcedure zu kapseln. Dennoch würde ich auch dort auf MERGE zurückgreifen. Ich denke wir sind uns einig, alles soweit wie möglich weg vom Quellcode in Richtung DB zu schieben, um die Programm-Wartung an sich, so einfach wie möglich zu machen. Welche Alternative zu FB-MERGE würdest du hier vorschlagen, um beide Fälle von RWarnecke abzudecken? Eine SP zusätzlich könnte die Anzahl der Parameter im Quelltext selber mindern, bringt jedoch wieder einen zusätzlichen call mit sich. Ich bin der Meinung, dass MERGE in diesem Falle soweit optimiert, wie möglich funzt... Lieg ich denn da falsch? |
AW: Update & Insert getrennt manuell ausführen oder eine Stored Procedure ?
Zitat:
|
AW: Update & Insert getrennt manuell ausführen oder eine Stored Procedure ?
Handshake... :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz