mySQL: REPLACE INTO (aktualisieren - oder auch nicht)

mySQL: REPLACE INTO (aktualisieren - oder auch nicht)

am 09.03.2006 09:48:58 von Stefan Christ

Hallo zusammen,

ich bin gestern zum ersten mal über die Möglichkeit gestolpert, einen
INSERT bzw ein UPDATE (unter mySQL 5.0) unter einen Hut zu bringen,
mittels REPLACE INTO. Laut Dokumentation wird - insofern der
Primärschlüssel noch nicht vorhanden ist - eine neue Zeile
eingefügt, ansonsten aktualisiert.

Nun hab ich dies mit einer Tabelle mit 3 Spalten versucht:

ID (int, PK) - datum (datetime) - anzahl (int)

Führe ich nun folgendes Statement aus:

REPLACE INTO tabelle (ID, datum, anzahl) VALUES (1, now(),
IFNULL(anzahl,0)+1)

so wird - falls noch kein Eintrag da ist - ein neuer angelegt, mit
aktuellem Datum und anzahl =3D 1.
Führe ich das Statement dann erneut aus, so wird zwar datum
aktualisiert, nicht aber anzahl erhöht. Weiss jemand aus welchem Grund
zwar die eine, nicht aber beide Spalten aktualisiert werden?

Einen schönen Tag noch,
Stefan

Re: mySQL: REPLACE INTO (aktualisieren - oder auch nicht)

am 09.03.2006 10:12:08 von Stefan Christ

Hallo nochmals.

Ich weiss nun weshalb sich das Statement so verhält: Es löscht
zunächst die Zeile und fährt dann einen Insert, deshalb ist Spalte
immer NULL (augfrund IFNULL also 0) und wird inkrementiert wieder
hineingeschrieben.

Leider besteht dadurch mein Problem noch immer: Selbst wenn ich für
die Spalte "zeile" einen subselect fahre, so wird dieser erst nach dem
Löschen der Zeile ausgeführt...ich erhalte wieder den Wert 1.

Noch jemand eine Idee?

Re: mySQL: REPLACE INTO (aktualisieren - oder auch nicht)

am 09.03.2006 11:56:32 von Helmut Chang

Stefan Christ schrieb:

> ich bin gestern zum ersten mal über die Möglichkeit gestolpert, einen
> INSERT bzw ein UPDATE (unter mySQL 5.0) unter einen Hut zu bringen,
> mittels REPLACE INTO.

Ein REPLACE INTO ist eben kein UPDATE (also aktualisieren), sondern ein
Ersetzen.

> Laut Dokumentation wird - insofern der
> Primärschlüssel noch nicht vorhanden ist - eine neue Zeile
> eingefügt, ansonsten aktualisiert.

Wie du selbst bereits festegstellt hast, wird ersetzt, nicht aktualisiert.

Das, was du möchtest, müsste doch unter 5.0 in einer Stored Procedure zu
kapseln sein?

BTW: Wo ist dein PHP-Problem?

X'Post und F'Up nach

gruss, heli

Re: mySQL: REPLACE INTO (aktualisieren - oder auch nicht)

am 16.04.2006 03:28:26 von Thomas Rachel

Stefan Christ wrote:

> Hallo nochmals.
>
> Ich weiss nun weshalb sich das Statement so verhält: Es löscht
> zunächst die Zeile und fährt dann einen Insert, deshalb ist Spalte
> immer NULL (augfrund IFNULL also 0) und wird inkrementiert wieder
> hineingeschrieben.
>
> Leider besteht dadurch mein Problem noch immer: Selbst wenn ich für
> die Spalte "zeile" einen subselect fahre, so wird dieser erst nach dem
> Löschen der Zeile ausgeführt...ich erhalte wieder den Wert 1.
>
> Noch jemand eine Idee?

Auch wenn die Anfrage evtl. schon etwas älter ist: Hilft evtl.


INSERT INTO tabelle (ID, datum, anzahl) VALUES (1, now(), 1)
ON DUPLICATE KEY UPDATE datum=now(), anzahl=anzahl+1;


weiter?


Thomas
--
"Macht's gut und danke für den Fisch"
Signatur zum Gedenken an Douglas Adams (1952 - 11.05.2001)
http://www.douglasadams.com/