AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi UPDATE nicht ausführen, wenn nichts?
Thema durchsuchen
Ansicht
Themen-Optionen

UPDATE nicht ausführen, wenn nichts?

Ein Thema von himitsu · begonnen am 17. Jun 2016 · letzter Beitrag vom 21. Jun 2016
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#1

UPDATE nicht ausführen, wenn nichts?

  Alt 17. Jun 2016, 11:00
Datenbank: postgres • Version: 5.3 • Zugriff über: PgDAC
Warum hat das UPDATE-SQL kein Flag für "tu nichts, wenn sich kein Feld ändert" ?

Wenn ich nicht will, dass Trigger ausgelöst werden, wenn sich nicht ändert, dann darf ich alle Felder im SET nochmal im WHERE gegenprüfen.
> Doppelter Code
> OK, wenn es richtig viel wird, könnte man die Auswertungen z.B. in einen LATERAL-JOIN auslagern und im WHERE/SET nur noch das Ergebnis vergleichen/zuweisen.

SQL-Code:
UPDATE test
SET aaa = hierganzviel
    bbb = hierauchganzviel
WHERE id = ...
  AND aaa IS DISTINCT FROM hiernochmalganzviel
  AND bbb IS DISTINCT FROM hierauchnochmalganzviel
Aber so ein "kurzer" Befehl ala "DISTINCT" wäre doch eigentlich ganz praktisch?
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 17. Jun 2016, 11:35
Warum hat das UPDATE-SQL kein Flag für "tu nichts, wenn sich kein Feld ändert" ?
Weil der mündige Benutzer nie im Leben bereits vorhandene Daten mit sich selbst überschreiben würde?
Und wenn doch, dann hat er gute Gründe dafür?


Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 17. Jun 2016, 12:35
Außerdem ist der DB-Aufwand, das zu prüfen auch einfach höher als einfach ohne Prüfung zu schreiben. Man müsste ja bei jedem Schreibvorgang vorher erst noch prüfen, ob die Daten übereinstimmen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#4

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 17. Jun 2016, 14:26
Darum ja auch als "aktivierbares" Zusatzfeature, das Standardmäßig nicht aktiv ist.
Um nur die Trigger neu anzustoßen, machen Viele oft einfach einen Post ohne Änderung, ala SET aaa=aaa Der Aufwand das selber zu prüfen ist auch größer (längeres SQL und eventuell doppelte Auswertung), als wenn die DB das von selber schon könnte.


Ich finde das wäre ein gutes Grundfeature, so wie ein INSERT OR UPDATE.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 17. Jun 2016, 14:34
Oder im Trigger prüfen was und ob sich etwas geändert hat und nur dann eine Aktion ausführen
Fritz Westermann
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.875 Beiträge
 
Delphi 12 Athens
 
#6

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 17. Jun 2016, 15:38
Oder im Trigger prüfen was und ob sich etwas geändert hat und nur dann eine Aktion ausführen
genau, das ist das Standardprocedere!
Thomas Breitkreuz
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 17. Jun 2016, 18:34
Nur mal so dahingedacht:
  • Der UPDATE -Trigger wird immer ausgelöst, wenn ein UPDATE Statement abgesetzt wird.
  • Ein TIMESTAMP Feld (mit ON UPDATE CURRENT_TIMESTAMP ) wird nur dann aktualisiert, wenn sich wirklich Daten in der Zeile ändern.
Im UPDATE -Trigger braucht man jetzt also nur noch zu prüfen, ob es eine Änderung im TIMESTAMP Feld gibt (IF OLD.ts <> NEW.ts THEN ) und schon kann man darauf gesondert reagieren.

So funktioniert es z.B. bei MySQL
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 18. Jun 2016, 22:51
Per Trigger mit :new/ :old zu arbeiten ist wahrscheinlich das gängige Verfahren.
Alternativ kannst Du das Update so gestalten, dass es
- 0 Rows betrifft und damit auch
- ein Trigger nicht zündet bzw.
- ein Trigger gar nicht definiert sein muss oder
- unspezifisch sein kann:
Für ein "leeres" Update kann man z.B. als Bedingung
Code:
where exists
mit
Code:
Select <aktueller Feldinhalt/Felder> from UpdateTable where..
except
Select <neue Feldwerte oder bestehende Feldwerte> from <jenachdem> <where ..>
kombinieren.

Das ist wahrscheinlich nicht viel weniger als "ganz viel und hier auch ganz viel", aber es hat den Charme, dass man nicht nachdenken muss und die Statements anhand der Felder der Tabelle generisch bauen kann (ohne PK und andere frei wählbare Ausnahmen). Ob es dann zündet, regelt das "except".
Was final geupdated wird, steht unabhängig davon in der Update ExpressionList. Kann man gut finden, weil weiterer Freiheitsgrad, kann aber auch falsch gemacht werden.

Andere DB können im Update statt der ExpressionList auch gleich Selects verwenden, dass macht es etwas eleganter.

Unterscheiden muss man hier bei den Where Bedingungen natürlich zwischen SingleRow Updates und Massenupdates.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 19. Jun 2016, 17:09
Aber warum so umständlich, wenn man das mit einem TIMESTAMP Feld komplett erschlagen kann?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#10

AW: UPDATE nicht ausführen, wenn nichts?

  Alt 20. Jun 2016, 08:13
Es ist einfach eine Möglichkeit, damit und mit anderen Problemen umzugehen. Sozusagen eine Ikea Antwort, entdecke die Möglichkeiten.

Ich brauche/will/darf keinen Trigger,
Ich brauche/will/darf kein Update Feld,
Ich habe in PG nicht direkt die MySQL On Update Definition zur Verfügung,

Es ist flexibler als ein Catchall Update Timestamp:
Wenn bspw. beim Kunden ein Tippfehler in der Anschrift korrigiert wird, interessiert mich vielleicht dieses Update Event, wechselt aber ein Flag / Statusfeld durch eine BusinessOperation seinen Wert, interessiert mich das vielleicht überhaupt nicht als Kundenupdate Event, weil die BO den Event implizit logged/dokumentiert.

Und kompliziert ist ja relativ, innerhalb eines Update Statementgerüsts ist es nichts viel mehr als die Wiederholung einer Feldliste/Parameterliste.
Update myTable
set
<feldliste>
<parameterliste>
where
<corecondition>
and exists
(
select <feldliste> from myTable where <corecondition>
except
select <parameterlist> [from myTable where <corecondition]>
)
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 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