Insert oder Update?

Uwe Friedrich

Angesehenes Mitglied
Hallo,

welche Methoden gibt es um festzustellen ob ich mit einem Datensatz ein Insert oder ein Update machen muss? Zur Zeit gehe ich so vor, das ich zuerst einen Select mache und dann, je nachdem ob ich einen Datensatz mit dem entsprechenden Schlüssel gefunden habe oder nicht, die entsprechende Methode wähle.
Die DB ist MySQL mit Delphi.

Vielen Dank schon mal.

Grüße von U. Friedrich
 
QUOTE (Uwe Friedrich @ Fr 30.12.2005, 17:17)[...] welche Methoden gibt es um festzustellen ob ich mit einem Datensatz ein Insert oder ein Update machen muss? Zur Zeit gehe ich so vor, das ich zuerst einen Select mache und dann, je nachdem ob ich einen Datensatz mit dem entsprechenden Schlüssel gefunden habe oder nicht, die entsprechende Methode wähle. [...]


CODE Wenn Datensatz vorhanden
benutze Update
Sonst
benutze Insert


no comment...



MfG Sascha Ahlers
 
oder:

CODE Update, wenn nichts verändert, insert


wobei nichts verändert -> changed rowcount = 0

Gruss
Roger
 
QUOTE welche Methoden gibt es um festzustellen ob ich mit einem Datensatz ein Insert oder ein Update machen muss? Zur Zeit gehe ich so vor, das ich zuerst einen Select mache und dann, je nachdem ob ich einen Datensatz mit dem entsprechenden Schlüssel gefunden habe oder nicht, die entsprechende Methode wähle.
Die DB ist MySQL mit Delphi.

Ich rate jetzt nur, aber vermutlich soll die Entscheidung nicht vom Client (Delphi), sondern vom Datenbanksystem (durch geschicktes SQL-Statement, oder ähnliches) fallen.

In diesem Fall solltest du dich in Richtung "Stored Procedures" informieren.
Ein Link dazu in die MySQL-Doku:
http://dev.mysql.com/doc/refman/5.0/en/sto...procedures.html
Gute Literatur dazu ist aber sicher sehr hilfreich.
 
QUOTE Wenn Datensatz vorhanden
benutze Update
Sonst
benutze Insert


Soweit war ich schon, mir ging es um die schnellste Methode um festzstellen, ob denn der Datensatz schon vorhanden ist. Also, ob es etwas Effektiveres gibt als erst einen Select zu machen und dann zu entscheiden das bei RecordCount = 0 ein Insert zu wählen ist und bei RecordCount > 0 ein Update.
Etwas was mir diesen Select erspart, evtl. gleich als komplettes SQL-Statement.

Uwe Friedrich
 
QUOTE (Uwe Friedrich @ Fr 30.12.2005, 19:41)Soweit war ich schon, mir ging es um die schnellste Methode um festzstellen, ob denn der Datensatz schon vorhanden ist. Also, ob es etwas Effektiveres gibt als erst einen Select zu machen und dann zu entscheiden das bei RecordCount = 0 ein Insert zu wählen ist und bei RecordCount > 0 ein Update.
Etwas was mir diesen Select erspart, evtl. gleich als komplettes SQL-Statement.


Ich wüsste nichts SQL-mässiges, was das könnte (kenne aber auch MySQL nicht). Für mich hab ich das Problem so gelöst, dass beim Tabellendesign immer festgelegt wird, dass Primärschlüsselfelder nicht den Wert (die Zahl) 0 enthalten dürfen, Schlüsselwerte also bei 1 beginnen. Dann gibts jeweils eine Stored Procedure, welche abhängig vom übergebenen Schlüsselwert einen Insert (bei 0) oder Update (bei >0) macht. Das Frontend muss lediglich sicherstellen, dass bei allen Records, die innerhalb vom Frontend neu erstellt werden, im Schlüsselfeld 0 steht. Zum Speichern übergibt es dann einfach alle Werte an die Stored Procedure, und die macht den Rest. Beispiel-Procedure aus SQL Server:


CODE CREATE PROCEDURE P_SetDetail
(
@DetailID int,
@FotoID int,
@DetailKey nvarchar(50),
@Titel nvarchar(250),
@Text nvarchar(4000)
)
AS

DECLARE @NewID int, @NewSort smallint

IF @DetailID=0
BEGIN -- Insert
SET @NewSort = (ISNULL((SELECT MAX(Sort) FROM T_Details WHERE DetailKey=@DetailKey),0) + 1)
INSERT INTO T_Details (FotoID, DetailKey, Titel, Text, Sort)
VALUES (@FotoID, @DetailKey, @Titel, @Text, @NewSort)
SET @NewID=@@IDENTITY
END
ELSE
BEGIN -- Update
UPDATE T_Details SET FotoID=@FotoID, DetailKey=@DetailKey, Titel=@Titel, Text=@Text
WHERE DetailID=@DetailID
SET @NewID=@DetailID
END

RETURN (@NewID)

GO


Griessli
Irene
 
Die oben von Roger Bobst erwähnte Methode ist schon relativ effizient, da Du nur 2 DB Anfragen machst, wenn die Erste 0 zurückliefert, während der von Dir erwähnte Ansatz immer 2 Anfragen benötigt.

Wenn es nun so sein sollte, dass der UPDATE Fall wesentlich häufiger als der INSERT Fall sein sollte, dann ist diese Methode zu 99% ausreichend.
 
Zurück
Oben