PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gibt es eine intelligente Lösung dafür?



jkreuzer
08.08.2006, 23:10
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

Kesar_Neron
09.08.2006, 12:35
Hallo,

würde einfach mal sowas sagen wie:

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

supersucker
09.08.2006, 12:51
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.

heady
09.08.2006, 15:31
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

jkreuzer
09.08.2006, 19:10
Was sind denn procedures und wie arbeitet man damit?
Ist für mich totales Neuland.

Bierhasser
10.08.2006, 19:27
Eventuell mittels REPLACE (http://dev.mysql.com/doc/refman/4.0/de/replace.html)

Kuli
11.08.2006, 14:03
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

jkreuzer
12.08.2006, 10:14
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

Kuli
14.08.2006, 15:26
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

jkreuzer
15.08.2006, 10:10
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

Kuli
15.08.2006, 17:06
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