Datensätze speichern, egal ob sie schon da sind oder nicht

Datensätze speichern, egal ob sie schon da sind oder nicht

am 13.09.2006 22:03:26 von Arno Fleck

Hallo!

Ich habe folgendes Problem: Ich möchte an einer Stelle im Programm immer
wieder einige Datensätze (ein paar Dutzend) aktualisieren. Für mich
spielt es dabei keine Rolle, ob die Datensätze schon da sind oder eben
noch nicht. So wie ich das bisher verstehe, _muss_ man ja aber für neue
Datensätze "INSERT INTO" anwenden und bestehende mit "UPDATE" aktualisieren.
Soweit so gut - aber muss ich jetzt wirklich jedesmal erstmal ein INSERT
absetzen und im Fehlerfall dann ein UPDATE hinterherschieben? Oder sogar
erst ein SELECT und dann entscheiden, was ich mache?

Oder habe ich gerade ein Brett vorm Hirn und sehe nicht das
Offensichtliche, wie man sowas elegant löst?

Vielen Dank im Voraus,
Arno Fleck

Re: Datensätzespeichern, egal ob sie schon da sind oder nicht

am 13.09.2006 22:21:56 von Thomas Rachel

Arno Fleck wrote:

[UPDATE, falls da, INSERT, falls nicht da]

> Oder habe ich gerade ein Brett vorm Hirn und sehe nicht das
> Offensichtliche, wie man sowas elegant löst?

2 Möglichkeiten:

- REPLACE

- INSERT ... ON DUPLICATE KEY ...


Thomas

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 13.09.2006 22:43:31 von Christian Schmidt

Am Wed, 13 Sep 2006 22:03:26 +0200 schrieb Arno Fleck:

> Hallo!
>
> Ich habe folgendes Problem: Ich möchte an einer Stelle im Programm immer
> wieder einige Datensätze (ein paar Dutzend) aktualisieren. Für mich
> spielt es dabei keine Rolle, ob die Datensätze schon da sind oder eben
> noch nicht. So wie ich das bisher verstehe, _muss_ man ja aber für neue
> Datensätze "INSERT INTO" anwenden und bestehende mit "UPDATE" aktualisieren.
> Soweit so gut - aber muss ich jetzt wirklich jedesmal erstmal ein INSERT
> absetzen und im Fehlerfall dann ein UPDATE hinterherschieben? Oder sogar
> erst ein SELECT und dann entscheiden, was ich mache?
>
> Oder habe ich gerade ein Brett vorm Hirn und sehe nicht das
> Offensichtliche, wie man sowas elegant löst?
>
> Vielen Dank im Voraus,
> Arno Fleck

Schau mal nach INSERT IGNORE

Gruß

Chris

--
Jetzt auch bei mir: http://blog.superbilk.org

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 14.09.2006 07:23:03 von Helmut Chang

Thomas Rachel schrieb:

> [UPDATE, falls da, INSERT, falls nicht da]
>
> 2 Möglichkeiten:
>
> - REPLACE

AFAIK ist das MySQL-spezifisch. Obwohl es fast anzunehmen ist, hat Arno
nirgendwo erwähnt, dass es sich um MySQL handelt.

gruss, heli

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 14.09.2006 11:43:41 von Claus Reibenstein

Thomas Rachel schrieb:

> - INSERT ... ON DUPLICATE KEY ...

Welche Datenbank unterstützt das? MySQL offensichtlich nicht. Jedenfalls
habe ich in der Doku nichts gefunden.

Gruß. Claus

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 14.09.2006 11:48:17 von Claus Reibenstein

Arno Fleck schrieb:

> Ich habe folgendes Problem: Ich möchte an einer Stelle im Programm immer
> wieder einige Datensätze (ein paar Dutzend) aktualisieren. Für mich
> spielt es dabei keine Rolle, ob die Datensätze schon da sind oder eben
> noch nicht. So wie ich das bisher verstehe, _muss_ man ja aber für neue
> Datensätze "INSERT INTO" anwenden und bestehende mit "UPDATE" aktualisieren.
> Soweit so gut - aber muss ich jetzt wirklich jedesmal erstmal ein INSERT
> absetzen und im Fehlerfall dann ein UPDATE hinterherschieben? Oder sogar
> erst ein SELECT und dann entscheiden, was ich mache?

Mach einfach erst ein DELETE und dann ein INSERT.

Gruß. Claus

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 14.09.2006 12:33:29 von Helmut Chang

Claus Reibenstein schrieb:

> Mach einfach erst ein DELETE und dann ein INSERT.

*Urgs!* Hältst du das für sinnvoll, wenn die zu löschenden Datensätze
Relationen in anderen Tabellen haben?

gruss, heli

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 14.09.2006 12:47:36 von Claus Reibenstein

Helmut Chang schrieb:

> Claus Reibenstein schrieb:
>
>> Mach einfach erst ein DELETE und dann ein INSERT.
>
> *Urgs!* Hältst du das für sinnvoll, wenn die zu löschenden Datensätze
> Relationen in anderen Tabellen haben?

Davon war nirgends die Rede :-)

Gruß. Claus

Re: Datensätze speichern, egal o

am 14.09.2006 12:58:47 von Carsten Wiedmann

Claus Reibenstein schrieb:

> Thomas Rachel schrieb:
>
> > - INSERT ... ON DUPLICATE KEY ...
>
> Welche Datenbank unterstützt das? MySQL offensichtlich nicht. Jedenfalls
> habe ich in der Doku nichts gefunden.

Also laut dem Manual MySQL seit 4.1.0. Hab ich grad auf Anhieb das separate
Unterkapitel [1] dazu gefunden ;-)

Gruß
Carsten

[1] http://dev.mysql.com/doc/refman/4.1/en/insert-on-duplicate.h tml

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 14.09.2006 14:02:04 von Claus Reibenstein

Carsten Wiedmann schrieb:

> Claus Reibenstein schrieb:
>
>> Thomas Rachel schrieb:
>>
>>> - INSERT ... ON DUPLICATE KEY ...
>>
>> Welche Datenbank unterstützt das? MySQL [...]
>
> Also laut dem Manual MySQL seit 4.1.0. Hab ich grad auf Anhieb das separate
> Unterkapitel [1] dazu gefunden ;-)

Ah ja. Meine Doku beschreibt noch die 4.0. Muss ich wohl mal
aktualisieren :-)

Sorry. Claus

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 14.09.2006 14:18:33 von Alex Hepp

Helmut Chang schrieb:
> Claus Reibenstein schrieb:
>
>> Mach einfach erst ein DELETE und dann ein INSERT.
>
> *Urgs!* Hältst du das für sinnvoll, wenn die zu löschenden Datensätze
> Relationen in anderen Tabellen haben?
>
> gruss, heli

was macht denn ein INSERT IGNORE anderes? wenn immer alle werte
eingetragen werden, sind die Referenzen wohl genauso dahin, wenn nicht
der Insert weiss, wie sie zu referenzieren sind, oder?

Entscheidend ist aber, was bei einer Reference integrity Violation
passiert, ob die DB den INSERT IGNORE dennoch zulässt, der DELETE dürfte
dann eigentlich fehlschlagen!

Gruß Alex

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 14.09.2006 15:12:31 von Niels Braczek

Alex Hepp schrieb:

> was macht denn ein INSERT IGNORE anderes? wenn immer alle werte=20
> eingetragen werden, sind die Referenzen wohl genauso dahin, wenn nicht =

> der Insert weiss, wie sie zu referenzieren sind, oder?

Es führt den INSERT ggf. einfach nicht aus, bricht aber auch nicht ab,
dh. der Original-Datensatz bleibt unbeschadet.

MfG
Niels

--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------

Re: Datensätzespeichern, egal ob sie schon da sind oder nicht

am 14.09.2006 15:30:20 von Andreas Scherbaum

Niels Braczek wrote:
> Alex Hepp schrieb:
>
>> was macht denn ein INSERT IGNORE anderes? wenn immer alle werte
>> eingetragen werden, sind die Referenzen wohl genauso dahin, wenn nicht
>> der Insert weiss, wie sie zu referenzieren sind, oder?
>
> Es führt den INSERT ggf. einfach nicht aus, bricht aber auch nicht ab,
> dh. der Original-Datensatz bleibt unbeschadet.

Damit ist dem Originalposter noch nicht geholfen, jetzt müsste er
die Anzahl geänderter Zeilen herausfinden, da es schon keinen Fehler gab
und müsste trotzdem noch ein Update fahren. Schliesslich will er ja
seine geänderten Daten noch in der DB unterbringen.

Also kann er auch bei der Reihenfolge Lock, Select, Insert oder Update
bleiben.


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 14.09.2006 16:29:33 von Helmut Chang

Alex Hepp schrieb:

>> *Urgs!* Hältst du das für sinnvoll, wenn die zu löschenden Datensätze
>> Relationen in anderen Tabellen haben?
>
> was macht denn ein INSERT IGNORE anderes? wenn immer alle werte
> eingetragen werden, sind die Referenzen wohl genauso dahin, wenn nicht
> der Insert weiss, wie sie zu referenzieren sind, oder?

Kann es sein, dass wir von unterschiedlichen Richtungen, in die die
Relationen zeigen, sprechen? MySQL:

CREATE TABLE Foo (
xyz... PRIMARY KEY
);

CREATE TABLE Bar (
pkColumn...,
xyz...

FOREIGN KEY xyz REFERENCES Foo(xyz)
ON DELETE...?
);

Bei ON DELETE RESTRICT geht das DELETE-Statement auf Table Foo schief.
Bei ON DELETE CASCADE fehlt danach der Datensatz in Table Bar.

In beiden Fällen ist zuerst löschen dann neu einfügen nicht die Lösung.

Den Zusammenhang zu INSERT IGNORE kann ich übrigens auch nicht ganz
herstellen:



| If you use the IGNORE keyword, errors that occur while executing the
| INSERT statement are treated as warnings instead. For example,
| without IGNORE, a row that duplicates an existing UNIQUE index or
| PRIMARY KEY value in the table causes a duplicate-key error and the
| statement is aborted. With IGNORE, the row still is not inserted,...
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

gruss, heli

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 15.09.2006 09:40:53 von Alex Hepp

Hallo Helmut,

Helmut Chang schrieb:

> [...]
>
> In beiden Fällen ist zuerst löschen dann neu einfügen nicht die Lösung.

Ich meinte nicht wirklich eine andere Richtung, Foreign Key einer
anderen Tabelle referenziert auf die Tabelle, in der die Eintragungen
gemacht werden sollen, gibt es einen Constraint, schlägt die Löschung
fehl...

> Den Zusammenhang zu INSERT IGNORE kann ich übrigens auch nicht ganz
> herstellen:
>
>
>
> | If you use the IGNORE keyword, errors that occur while executing the
> | INSERT statement are treated as warnings instead. For example,
> | without IGNORE, a row that duplicates an existing UNIQUE index or
> | PRIMARY KEY value in the table causes a duplicate-key error and the
> | statement is aborted. With IGNORE, the row still is not inserted,...

muss eingestehen, dass ich das verwechselt habe, sorry, ging aufgrund
des Postings von Christian Schmidt irgendwie davon aus, dass ein INSERT
IGNORE eine Art Alias für REPLACE ist, es ist aber genau umgekehrt.
Sorry dafür... Was ich also sagen wollte, ist, dass auch bei einem
REPLACE Referenzen verloren gehen könnten.

Ist es dann nicht so, dass im Fall des OP ein ON DUPLICATE KEY UPDATE
das Mittel der Wahl wäre, wie Thomas Rachel schon sagte?

Grüße alex

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 15.09.2006 10:58:27 von Helmut Chang

Alex Hepp schrieb:

> Sorry dafür... Was ich also sagen wollte, ist, dass auch bei einem
> REPLACE Referenzen verloren gehen könnten.

Richtig. Ist eine kleine, gemeine Falle: wenn man REPLACE nicht genau
studiert, könnte man auf die Idee kommen, dass es prüft: Datensatz nicht
vorhanden ? INSERT : UDATE. Dass tatsächlich gelscht und neu eingefügt
wird, ist eigentlich nicht das Wahre und musste ich selbst vor einigen
Jahren feststellen.

> Ist es dann nicht so, dass im Fall des OP ein ON DUPLICATE KEY UPDATE
> das Mittel der Wahl wäre, wie Thomas Rachel schon sagte?

Ich denke auch. Beinhaltet allerdings auch wieder den Stolperstein, dass
es sich auch bei doppelten Werten für jeglichen UNIQUE CONSTRAINT/KEY
auswirkt.

gruss, heli

Re: Datensätzespeichern, egal ob sie schon dasind oder nicht

am 15.09.2006 11:12:04 von Andreas Froede

Arno Fleck wrote:
> Ich habe folgendes Problem: Ich möchte an einer Stelle im Programm immer
> wieder einige Datensätze (ein paar Dutzend) aktualisieren. Für mich
> spielt es dabei keine Rolle, ob die Datensätze schon da sind oder eben
> noch nicht.

> Soweit so gut - aber muss ich jetzt wirklich jedesmal erstmal ein INSERT
> absetzen und im Fehlerfall dann ein UPDATE hinterherschieben? Oder sogar
> erst ein SELECT und dann entscheiden, was ich mache?

Schreib dir eine Serverseitige Funktion die das macht und verbiege das
INSERT per Rule darauf.

> Oder habe ich gerade ein Brett vorm Hirn und sehe nicht das
> Offensichtliche, wie man sowas elegant löst?

Es sind einfach grundverschiedene Dinge. Etwas einfügen ist was ganz
anderes als ändern.

CIAO
andreas
--
.... oben geht es um den Thron - unten geht es um Deinen Hintern ...
[Keimzeit]
Klettern in Thüringen: http://www.climb.spider-net.de
Kletterhalle in Jena: http://www.wand.spider-net.de

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 15.09.2006 11:37:23 von Alex Hepp

Helmut Chang schrieb:
> Alex Hepp schrieb:

>> Ist es dann nicht so, dass im Fall des OP ein ON DUPLICATE KEY UPDATE
>> das Mittel der Wahl wäre, wie Thomas Rachel schon sagte?
>
> Ich denke auch. Beinhaltet allerdings auch wieder den Stolperstein, dass
> es sich auch bei doppelten Werten für jeglichen UNIQUE CONSTRAINT/KEY
> auswirkt.

Das ist allerdings ein Stolperstein, vor allem, wenn man nachträglich
nochmal einen zb. kombinierten UNIQUE CONSTRAINT einbaut, und vielleicht
nicht mehr daran denkt, das man ein ON DUPLICATE KEY UPDATE drin hat...

Vielleicht ist es doch besser, die Logik im php drin zu haben, wenns
existiert, wirds eben neu eingetragen. So hat man quasi "volle
Kostenkontrolle" ;)

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 15.09.2006 11:57:21 von Helmut Chang

Alex Hepp schrieb:

> Vielleicht ist es doch besser, die Logik im php drin zu haben,...

Stored Procedures halt ich da für besser, wenn verfügbar. Wobei ich mir
jetzt nicht sicher bin, ob SQL-Statements innerhalb einer SP als atomar
zu betrachten sind und keine Race Conditions auftreten können.

gruss, heli

Re: Datensätzespeichern, egal ob sie schon da sind oder nicht

am 15.09.2006 14:04:43 von Andreas Scherbaum

Helmut Chang wrote:
> Alex Hepp schrieb:
>
>> Vielleicht ist es doch besser, die Logik im php drin zu haben,...
>
> Stored Procedures halt ich da für besser, wenn verfügbar. Wobei ich mir
> jetzt nicht sicher bin, ob SQL-Statements innerhalb einer SP als atomar
> zu betrachten sind und keine Race Conditions auftreten können.

Nun, solange du die SP als Transaktion (oder als innerhalb einer
Transaktion) betrachtest, dürfte es hier kein Problem geben. Die DB
sollte sich um die Race Conditions kümmern.


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: Datensätze speichern, egal ob sie schon da sind oder nicht

am 24.09.2006 12:15:06 von Arno Fleck

Hallo!

Ich habe bisher ganz vergessen, mich für die vielen Antworten zu
bedanken. Hiermit also besten Dank!

Ich verwendet tatsächlich mySQL und da ich keine Fremdschlüssel oder
ähnliches in der besagten Tabelle habe, reicht mir die Anweisung
"REPLACE" tatsächlich aus.

Viele Grüße,
Arno