Gibt es eine intelligente Lösung dafür?

J

jkreuzer

Eroberer
Hallo,

ich möchte am besten mit einem einzigen SQL Befehl folgendes erreichen:
Wenn in einer Tabelle ein Datensatz mit der ID 'id' schon existiert dann soll er die Spalte A mit einem bestimmten Wert updaten, wenn noch kein Datensatz mit der ID 'id' vorhanden ist, soll dieser angelegt werden und die Spalte A befüllt werden.

Mit mehreren Befehlen ist es kein Problem, aber langweilig meiner Meinung nach.

Kennt sich da jemand aus? Meine Versuche haben alle nicht funktioniert.

Servus,
Johannes
 
hmmmm...

Hallo,

würde einfach mal sowas sagen wie:

UPDATE 'feld' WHERE 'id' = 'wert';
 
Hallo,

würde einfach mal sowas sagen wie:

UPDATE 'feld' WHERE 'id' = 'wert';

Ich würde einfach mal so sagen du solltest vor dem Posten einer Antwort die Frage lesen.

@jkreuzer

IMHO geht das nicht mit einem SQL-Befehl, sowas würde man z.b. serverseitig mit PL/SQL lösen, oder halt eben mit mehreren SQL-Befehlen auf der Client-Seite.
 
tja ich weiß nicht ab welcher version und ob es unter mysql schon pl-sql gibt...(also das procedure-ding ;) )

ich würde so ein problem mit procedures lösen
 
Was sind denn procedures und wie arbeitet man damit?
Ist für mich totales Neuland.
 
jkreuzer schrieb:
ich möchte am besten mit einem einzigen SQL Befehl folgendes erreichen:
Wenn in einer Tabelle ein Datensatz mit der ID 'id' schon existiert dann soll er die Spalte A mit einem bestimmten Wert updaten, wenn noch kein Datensatz mit der ID 'id' vorhanden ist, soll dieser angelegt werden und die Spalte A befüllt werden.
Falls es noch interessiert:

INSERT INTO table VALUES (1, 2, 3, 4) ON DUPLICATE KEY UPDATE a=c+3, b='Fromms';

-Kuli
 
Das klingt ja schon mal nicht schlecht. Problem ist nur, dass die ID kein KEY ist und es auch sein darf.
Eigentlich ist es so, dass zwei Spalten zusammen den eindeutigen Datensatz bilden. Das hatte ich anfangs weggelassen, um es übersichtlicher und besser zu erklären.
Kann man nach ON anstatt DUPLICATE KEY irgendeinen anderen Befehl schreiben?

Servus,
Johannes
 
Hallo Johannes,

nein, das geht nicht. Du kannst natürlich einen UNIQUE INDEX setzen, aber dann muß die Spalte eben eindeutig sein.

Die Konstellation ist aber auch seltsam. Du willst einen neuen Eintrag, wenn gar Eintrag mit der entsprechenden ID existiert, aber Du willst alle(?) Einträge ändern, wenn welche mit dieser ID existieren? Mal davon abgesehen, daß die Name ID dringendst vermuten läßt, daß es sich um eine (natürlich eindeutige) ID handelt (Du würdest ja auch keine Spalte NAME nennen, die dann nicht den Namen sondern die Telefonnummer beinhaltet), halte ich so einen Fall für sehr exotisch. Bist Du sicher, daß Du Dir Dein Tabellenmodell gut überlegt hast? Ansonsten denke ich, daß sowas so selten passiert, daß Du bequem mehrere Statements absetzen kannst.

Wenn Du unbedingt willst, daß mußt Du eine Procedure definieren (geht aber erst ab 5.0). Wie das geht, steht in
http://dev.mysql.com/doc/refman/5.0/en/stored-procedure-syntax.html

Viel Spaß!
-Kuli
 
Hallo Kuli,

danke für deine ausführliche Antwort.
Es ist so: Ich möchte natürlich nicht alle Spalten ändern sondern nur bestimmte Daten neu eintragen.
Zu dem Namen "ID": Er kommt aus einer anderen Tabelle, wo es eine echte ID ist. Zusammen mit einer anderen Spalte ergibt sich dann eine eindeutige Zuordnung für diese Tabelle.
Ich habe es bis jetzt eh mit mehrern Befehlen gelöst, es hätte mich nur interssiert, ob es da was besseres gibt.

Servus,
Johannes
 
Hallo Johannes,

ich meinte auch nicht alle Spalten, sondern alle Zeilen, aber egal.

Als Name für die ID-Spalte würde ich dann AndereTabelle_ID nehmen, um Verwechslungen zu vermeiden, aber das ist natürlich Geschmackssache und nicht Thema dieser Diskussion.

Eine kleine Anmerkung: Wenn Du parallele Threads oder mehrere DB-Clients hast, solltest Du aufs Locking achten, damit Dir nicht nach der Update-Prüfung jemand anders einen Insert unterjubelt. Wenn die Tabelle unter InnoDB läuft, dann ist alles in Ordnung, wenn Du die Existenz eines Eintrags mit passender ID mit dem UPDATE-Statement prüfst. Wenn Du mit einem SELECT prüfst, solltest Du FOR UPDATE hintendran hängen.:oldman

Viel Vergnügen! :)
-Kuli
 

Ähnliche Themen

Server-Monitoring mit RRDTool

Zurück
Oben