Seltsames verhalten von mysql
eddi
- datenbank
Hai,
mit PHP schreibe ich ständig in eine mysql Datenbanktabelle und lösche Einträge.
Wenn ich nun vor einem neuen Eintrag in der Tabelle eine Abfrage sende, ob der Eintrag schon vorhanden ist, um dann nur upzudaten statt neu anzulegen, bekomme ich oft (nicht immer!) einen Eintrag angezeigt, obwohl definitiv feststeht, dass der Eintrag eben gelöscht wurde.
Selbst, wenn ich vorher die gesamte Tabelle via phpMaAdmin geleert habe.
Ich bin mir auch "fast" sicher, dass das nur passiert, wenn ich die Abfrage mit dem IE sende während bei FF alles so läuft, wie es sein soll.
Kann sich irgendjemand den Effekt erklären?
Ich glaub langsam schon an Geister.
total frustrierter Gruß
Hi,
Wenn ich nun vor einem neuen Eintrag in der Tabelle eine Abfrage sende, ob der Eintrag schon vorhanden ist, um dann nur upzudaten statt neu anzulegen, bekomme ich oft (nicht immer!) einen Eintrag angezeigt, obwohl definitiv feststeht, dass der Eintrag eben gelöscht wurde.
Kann sich irgendjemand den Effekt erklären?
Caching?
eine Abfrage sende, ob der Eintrag schon vorhanden ist, um dann nur upzudaten statt neu anzulegen
Damit handelst du dir ohne Kapselung sowieso ein TOCTTOU-Problem ein.
INSERT ... ON DUPLICATE KEY UPDATE oder REPLACE könnten helfen.
MfG ChrisB
Caching?
Wäre auch mein erster Gedanke gewesen.
INSERT ... ON DUPLICATE KEY UPDATE oder REPLACE könnten helfen.
Mein 2. Gedanke.
Und mein 3. Gedanke: Vorsicht, wenn Dein Festplattenpltz zur neige geht. Dann spinnt mysql manchmal.
4. Gedanke: Bei mir spinnt mysql, wenn mein Laptop kurz vor dem Hitzetod steht immer komplett und macht nur noch Unsinn...
Gruß, Kai
an Caching dachte ich natürlich auch schon.
Die Frage wär dann "was dagegen tun?".
zu 3. und 4. Nöö, kann nicht sein. Der Fehler tritt sowohl auf meinem Produktionsserver sowie auch Online beim Hoster auf.
INSERT ... ON DUPLICATE KEY UPDATE oder REPLACE könnten helfen.
Wenn ich das richtig verstanden habe dann wäre das so:
Angenommen ich habe z.b. einen Warenkorb da steht drinne:
Id = 10; UserId = 12; ArtikelId = 123; Menge = 5; NochnFlag = 'ja';
Jetzt legt der User 12 den Artikel 3x dazu, wenn der Flag 'ja' ist.
Statt
SELECT * FROM warenkorb WHERE UserID = '12' AND ArtikelID = '123' AND NochnFlag = 'ja';
Wenn der Eintrag vorhanden ist
UPDATE warenkorb SET Menge = Menge+3 WHERE ID = '10;
sonst
INSERT INTO warenkorb SET usw.
Was ja offensichtlich masnchmal in die Hose geht, jetzt:
INSERT INTO warenkorb SET das ganze gedöns ON DUPLICATE KEY UPDATE menge= Menge+3;
ÖÖÖHM, wo ist mein WHERE geblieben?
So ganz raff ich das noch nicht :o(
ÖÖÖHM, wo ist mein WHERE geblieben?
So ganz raff ich das noch nicht :o(
An der Stelle wird kein vollständiges UPDATE-Statement mehr benötigt.
Das where kann ja deshalb schon fehlen, weil die bedingung doch bereits bekannt ist (durch den gesetzten Index).
Kai
An der Stelle wird kein vollständiges UPDATE-Statement mehr benötigt.
Das where kann ja deshalb schon fehlen, weil die bedingung doch bereits bekannt ist (durch den gesetzten Index).
OK soweit klar.
Und ich dachte schon ich spinn total....
Nur der Vollständigkeit halber:
Wenn ich aber z.B. an einer anderen Stelle des Projektes auf 4 Felder nen Index brauchen würde, der mir hier in die Suppe spuckt, dann hätt ich n Problem.
Nur der Vollständigkeit halber:
Wenn ich aber z.B. an einer anderen Stelle des Projektes auf 4 Felder nen Index brauchen würde, der mir hier in die Suppe spuckt, dann hätt ich n Problem.
Nöö, du kannst beliebig viele Indexe haben.
ON DUPLICATE KEY ...
bezieht sich nur auf UNIQUE Keys.
Gast
hi,
INSERT INTO warenkorb SET das ganze gedöns ON DUPLICATE KEY UPDATE menge= Menge+3;
ÖÖÖHM, wo ist mein WHERE geblieben?
Im Design.
So ganz raff ich das noch nicht :o(
Ein 'INSERT ... ON DUPLICATE KEY UPDATE...' will wissen, wann der Fall 'Duplicate Key' eintritt, das musst Du nur festlegen und dann funktioniert das alles wie von Geisterhand ;)
Hotti
Ein 'INSERT ... ON DUPLICATE KEY UPDATE...' will wissen, wann der Fall 'Duplicate Key' eintritt, das musst Du nur festlegen und dann funktioniert das alles wie von Geisterhand ;)
So wird er das nicht verstehen.Du benötigst im Design Deiner Tabelle einen (ggf. auch kombinierten) Indexeintrag.
kai
Ein 'INSERT ... ON DUPLICATE KEY UPDATE...' will wissen, wann der Fall 'Duplicate Key' eintritt, das musst Du nur festlegen und dann funktioniert das alles wie von Geisterhand ;)
So wird er das nicht verstehen.Du benötigst im Design Deiner Tabelle einen (ggf. auch kombinierten) Indexeintrag.
Achso, Du meinst dann ein Statement '... on duplicate index...' oder so. Das kannte ich noch nicht ;)
Hotti
Wenn ich nun vor einem neuen Eintrag in der Tabelle eine Abfrage sende, ob der Eintrag schon vorhanden ist, um dann nur upzudaten statt neu anzulegen, bekomme ich oft (nicht immer!) einen Eintrag angezeigt, obwohl definitiv feststeht, dass der Eintrag eben gelöscht wurde.
Selbst, wenn ich vorher die gesamte Tabelle via phpMaAdmin geleert habe.
Nochmal ich.
Ich hatte solch einen Effekt auch mal, bis ich merkte, dass ich parallel auf 2 Datenbanken arbeitete und dort löschte und einfügte.
Stell also sicher, dass Du nur in einer einzigen DB und Tabelle arbeitest.
Kai