Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Bedingtes Insert/Update geht das? (https://www.delphipraxis.net/184031-bedingtes-insert-update-geht-das.html)

Mavarik 20. Feb 2015 14:22

Datenbank: MySQL • Version: 5.x • Zugriff über: Nativ

Bedingtes Insert/Update geht das?
 
Hallo Zusammen!

Gibt es ein bedingtes Insert / Update?

Beispiel: Gegeben sei eine Datenbank mit 2 Feldern (Nr:Integer, D : Double)

Ich möchte einen Insert machen, wenn Nr in der Datenbank nicht enthalten ist und einen Update machen, wenn
Abs(D_alt-D_neu) > 0.02

Geht das in einem Execute Befehl?

Mavarik

Jumpy 20. Feb 2015 14:24

AW: Bedingtes Insert/Update geht das?
 
Das müsste doch sowas sein...

Mavarik 20. Feb 2015 14:33

AW: Bedingtes Insert/Update geht das?
 
Zitat:

Zitat von Jumpy (Beitrag 1290760)

OK Falls Nr ein Key ist... könnte man ja machen... Aber was ist mit der Bedingung?

Abs(D_alt-D_neu) > 0.02

vagtler 20. Feb 2015 14:55

AW: Bedingtes Insert/Update geht das?
 
http://stackoverflow.com/questions/4...f-false-insert

hstreicher 20. Feb 2015 15:38

AW: Bedingtes Insert/Update geht das?
 
evtl das hier:

http://dev.mysql.com/doc/refman/5.0/en/replace.html

oder

http://dev.mysql.com/doc/refman/5.0/...duplicate.html

Sir Rufo 20. Feb 2015 16:10

AW: Bedingtes Insert/Update geht das?
 
Bei beiden muss man aber aufpassen, ob auch genau das passiert, was man erreichen will!
  • REPLACE => Ist eine Kombination von DELETE und INSERT. Der alte Satz wird also wirklich gelöscht und der neue hinzugefügt.
  • ON DUPLICATE KEYS macht zwar ein bedingtes UPDATE wie gewünscht, allerdings mit dem Nebeneffekt, dass eine AUTOINC-Spalte einfach mal hochgezählt wird. Verhindern kann man dies durch ein Anpassen der Server-Einstellungen.
Beide Wege sind eben nicht falsch, haben aber ihre Eigenheiten :)

himitsu 20. Feb 2015 17:09

AW: Bedingtes Insert/Update geht das?
 
Schade, daß MySQL nicht sowas wie RETURNING kennt :cry:, dann ginge sowas
SQL-Code:
INSERT INTO Tabelle (Nr, D)
SELECT (:Nr, :D)
WHERE NOT (
  UPDATE Tabelle
  SET D = :D
  WHERE Nr = :Nr
    AND abs(D - :D) <= 0.02
  RETURNING true -- hier wird es schwer
)
UPDATE, wenn passend und wenn nicht TRUE, dann INSERT.


Alternativ muß man eben Beides machen.
SQL-Code:
UPDATE Tabelle
SET D = :D
WHERE Nr = :Nr
  AND abs(D - :D) <= 0.02;

INSERT INTO Tabelle (Nr, D)
SELECT (:Nr, :D)
WHERE NOT exists(SELECT *
                 FROM Tabelle
                 WHERE Nr = :Nr
                   AND abs(D - :D) <= 0.02);
(zuerst UPDATE und dann INSERT, damit das UPDATE das grade geINSERTe nicht nochmal sinnlos UPDATEd)


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz