Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

1 Zum Seitenanfang

Dienstag, 15. Januar 2008, 14:02

effizienteste Art, zu ermitteln ob Wert in DB existiert

Was ist die effizienteste Art, zu testen, ob ein Wert in einer DB schon gesetzt wurde, um darauf Fallbezogen ein INSERT oder UPDATE nachzusenden?


Würde jetzt ein einfaches SELECT ansetzen, oder gibt es bessere Funktionen, die mit geringerem Overhead auskommen?

Ich würde mit :
SELECT xName FROM TableX WHERE xName=$xName

abfragen, ob Ergebnissatz vorhanden. Wenn ja, ein UPDATE nachsenden, wenn nein ein INSERT.

Das wirkt auf mich sehr ineffizient. geht doch bestimmt eleganter??

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ospx« (15. Januar 2008, 14:41)

 

Talpida

Tripel-As

Dabei seit: 31.10.2007

Beiträge: 167

 

2 Zum Seitenanfang

Dienstag, 15. Januar 2008, 14:53

Wer nicht sucht, der auch nicht findet, der auch nicht weiss... :P

Suche und Finden = SELECT x FROM y WHERE z

eine andere Lösung würde ich sagen, gibt es dafür nicht. :-)
Und wenn es keine Hardcore-Tabellen sind oder du den langsamsten Server der Menschheitsgeschichte erwischt hast, dürfte es auch kein großes Problem sein.


Ausnahme:
siehst du ein paar Themen weiter unten... letzte Inkrementalzahl holen.
Aber ich denke du meinst ja irgendein x-beliebiges Feld mit x-beliebigem Inhalt, oder?
 

Skittles

Moderator

Dabei seit: 14.02.2004

Beiträge: 3 014

 

3 Zum Seitenanfang

Dienstag, 15. Januar 2008, 14:57

man könnt nen update machen und wenn das schief geht, nen insert hinterher, aber so wirklich gut ist das auch nicht ^^

~!__/
..o.o

This is Einkaufswagen.
Copy Einkaufswagen into your signature to help him on his way to world domination.
 

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

4 Zum Seitenanfang

Dienstag, 15. Januar 2008, 15:08

-- also doch erst das SELECT... --, und das nur, um zu wissen, ob Wert schon vorhanden oder nicht

Dank Euch beiden für die schnellen Antworten

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »ospx« (15. Januar 2008, 15:11)

 

heinervdm

Technik-Admin

Dabei seit: 02.10.2002

Beiträge: 3 772

 

5 Zum Seitenanfang

Dienstag, 15. Januar 2008, 15:49

Zitat

Original von Skittles
man könnt nen update machen und wenn das schief geht, nen insert hinterher, aber so wirklich gut ist das auch nicht ^^

Also manche MySQL Versionen machen bei einem Update Automatisch ein Insert, funktioniert zumindest bei mir hier in einem script, dass ich für mich geschrieben habe...
Über mich: www.heinervdm.de
Persönlich Mitteilungen an mich bitte als PN (nicht Email) hier im Forum. ICQ und Skype bitte nur in Notfällen.
 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

6 Zum Seitenanfang

Mittwoch, 16. Januar 2008, 09:12

Nu da gibts noch was .... nein, das ist zu elitär .... was solls:
http://dev.mysql.com/doc/refman/5.1/de/create-trigger.html

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »nocturne« (16. Januar 2008, 09:12)

 

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

7 Zum Seitenanfang

Donnerstag, 17. Januar 2008, 20:35

zumindest interessant, wenn auch im konkreten Fall nicht ganz zutreffend, da ja auf Existenz eines Wertes bzw. eines Datensatzes geprüft werden soll, der Trigger jedoch (wenn ich es richtig gesehen habe) vor oder nach einer Aktion weitere Aktionen anstoßen kann (mal salopp gesagt).
Trotzdem gute Quelle...
 

jetson224

Jungspund

Dabei seit: 06.01.2008

Beiträge: 24

 

8 Zum Seitenanfang

Donnerstag, 17. Januar 2008, 22:52

oder so ?

Bastele mich gerade duch ein ähnliches Problem, mein Ansatz ist z.Z.

SELECT COUNT(*) FROM table WHERE wert1=inputwert;

das gibt 1 wenns den schon gibt also UPDATE und
das gibt 0 wenn er noch nicht drin ist. also INSERT

Kommentare ? :S
 

heinervdm

Technik-Admin

Dabei seit: 02.10.2002

Beiträge: 3 772

 

9 Zum Seitenanfang

Donnerstag, 17. Januar 2008, 23:33

Zitat

Original von ospx
zumindest interessant, wenn auch im konkreten Fall nicht ganz zutreffend, da ja auf Existenz eines Wertes bzw. eines Datensatzes geprüft werden soll, der Trigger jedoch (wenn ich es richtig gesehen habe) vor oder nach einer Aktion weitere Aktionen anstoßen kann (mal salopp gesagt).
Trotzdem gute Quelle...

Ein teil eines Beispiels darin ist trotzdem sehr passend für dieses Problem:

Quellcode

1
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
Über mich: www.heinervdm.de
Persönlich Mitteilungen an mich bitte als PN (nicht Email) hier im Forum. ICQ und Skype bitte nur in Notfällen.
 

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

10 Zum Seitenanfang

Freitag, 18. Januar 2008, 09:52

@ heiner ok, da habe ich beim querlesen was übersehen.

@jetson224 : das ist ja die bekannte Ausgangslage und genau das, was ich gerade umgehen will( ok , du nutz ein count(), das ist u.U. eine kleine optimierung), da hier eigentlich ein gesamtes Statement gesendet, vom DB-Server beantwortet, zurückgesendet und von mir mit php wieder ausgewertet werden muss, worauf ich dann erst mit der eigentlichen Transaktion (UPDATE oder INSERT) beginnen könnte.

Mit jedem Sendevorgang werden zig byte für das wrappen der IP-Packete etc. verballert, obwohl als Antwort fast ein einzelnes Bit, Flag (ja/nein) ausreichen würde, ob Wert vorhanden oder nicht.

Laufen einige 100 dieser Abfragen, wird daraus ein wahnsinniger aufgeblähter Überhang, der aus meiner Sicht fast nicht vertretbar wäre.

Die Sache mit den Triggern ist eigentlich genau, was ich suchte.
 

nocturne

Kaiser

Dabei seit: 06.01.2005

Beiträge: 1 167

 

11 Zum Seitenanfang

Freitag, 18. Januar 2008, 10:01

Das Hauptproblem liegt darin das eine unbekannte anzahl von Zugriffen und Änderungen asynchron in die Datenbank laufen.

Also das zwischen
INSERT / DELETE / UPDATE
und
SELECT MAX (ID)

weitere Datenbankänderungen die Rückgabe des select-Querys verfälschen könnten.

Ein Trigger könnte durch beispielsweise eine "LastID's" Tabelle das Problem umgehen, dort muss dann auch die eindeutigkeit der Aktion gespeichert werden (wir nehmen die SessionID des benutzers).

Wenn jetzt aber jemand durch ein Submit ein Insert Fährt, das Laden der Webseite abbricht und dann nochmal auf Submit klickt und das Insert zum 2. mal fährt werden 2 Einträge hinzugefügt weil es sich um die gleiche SessionID handelt!

Also mit der eigentlichen Aufgabe könnte man das schon lösen, aber nicht ohne "Overhead"!

ON DUPLICATE KEY ist wohl die beste lösung

Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von »nocturne« (18. Januar 2008, 10:17)

 

ospx

Kaiser

Dabei seit: 11.11.2006

Beiträge: 1 131

 

12 Zum Seitenanfang

Freitag, 18. Januar 2008, 10:18

Guten Tag, Herr nocturne :P

Wohl wahr und obendrein sprichst du da mein nächstes weit größeres Problem an. Aber dafür kommt wohl in den nächsten Tagen ein neuer Thread an dieser Stelle.
Damit meine ich:
unbekannte anzahl von Zugriffen und Änderungen asynchron

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ospx« (18. Januar 2008, 10:22)