condor83
Goto Top

MySQL herausfinden ob INSERT oder UPDATE

Hallo...

Ich versuch da etwas in MySQL zu Realisiern und hoffe auf eure Hilfe.

Ich möchte Daten (als beispiel a=1, b=2, c=3) in eine Tabelle schreiben aber es soll vorher (zb mit einer art IF anweisung) geprüft werden, ob es bereits einen Datensatz gibt, bei dem a=1 und b=2 . wenn ja dann soll in diesem Datensatz nur c mit UPDATE aktualisiert werden, wenn er nicht existiert soll er mit INSERT angelegt werden.

mit REPLACE kann ich glaub ich nicht arbeiten da ja a und b stimmen müssen werden

wie das ganze mit hilfe von php funktionieren würde weiß ich - ich brauch es aber in sql

ist das überhaupt möglich und wenn ja bin ich für jede hilfe dankbar

lg
condor

Content-ID: 77589

Url: https://administrator.de/contentid/77589

Ausgedruckt am: 22.11.2024 um 14:11 Uhr

SlainteMhath
SlainteMhath 09.01.2008 um 09:39:09 Uhr
Goto Top
Moin,

welche Version von MySQL wird denn benutzt?

Ggfs. kanst Du das mit Stored Procedures abbilden, siehe http://dev.mysql.com/doc/refman/5.1/en/create-procedure.html
condor83
condor83 09.01.2008 um 11:11:54 Uhr
Goto Top
Danke erst mal für die Antwort!

ich arbeit derzeit local mit der 5er Version. Aber das projekt sollte irgendwann mal online gehen und derzeit hab ich noch keinen anbieter und weiß auch dessen version nicht. aber wenn die 5.1 notwendig ist werd ich mir schon einen entsprechenden Anbieter suchen.

Das mit den proceduren wär möglich - aber das würden dann eine große menge verschiedener gespeicherter prozeduren werden! wär es da sinnvoll die prozedur zu erstellen - ausführen und wieder löschen und für die nächste andere abfrage wieder erstellen - ausführen - löschen?

gibts vielleicht auch eine andere möglichkeit?
pi314
pi314 11.01.2008 um 08:57:15 Uhr
Goto Top
Hi,

wie wär's mit einem Trigger auf die Tabelle?
Hier kannst du bei INSERT prüfen, ob es diesen Satz bereits gibt und ihn ggf. updaten.

Desweiteren wäre ein Unique-Constraint auf deine Spalten A und B sinnvoll.
Dann hast du bereits gesichert, dass es A und B nicht gleich sein können innerhalb deiner Tabelle.

In deinem Fall könnte die auch die MERGE-Anweisung helfen.
Hier kannst du dein Logik zum Einfügen abbilden.

Genaue Syntax für MySQL hab' ich nicht im Kopf face-sad
aber Google hilft da bestimmt face-wink

greetz,
pi
condor83
condor83 11.01.2008 um 11:46:12 Uhr
Goto Top
Das mit dem Trigger muß ich mir mal genau Anschauen...

Ein Uniqe auf die Spalte A und B währe ja nicht sinnvoll denn es sollte folgendes möglich sein:

A | B | C
1 1 ?
1 2 ?
2 2 ?
2 1 ?

aber nicht

1 1 ?
1 1 ?

oder ist mit uniqu mehr möglich als ich weiß?

und MERGE hab ich in der MySQL-Dokumentation nur als Tabellentüp Speicherengine gefunden - ich glaub nicht das du das meinst.... - Wed mich da mal weiter umschauen
pi314
pi314 11.01.2008 um 13:46:49 Uhr
Goto Top
Wenn du dein Unique-Constraint auf mehrere Spalten anlegst,
sind alle Möglichkeiten dieser Spalten eindeutig.


UC auf Spalte A:
A   B   C
1   0   0
1   0   0 <-- nicht möglich
UC auf Spalten A+B:
A   B   C
1   0   0
1   1   0
0   1   0
0   1   1 <-- nicht möglich
UC auf Spalten A+B+C:
A   B   C
1   0   0
1   0   1
1   1   1
1   1   0 ...
1   1   0 <-- nicht möglich

Es ist also genau das möglich, was du willst - wenn ich dich richtig verstanden habe face-smile.
Ich schau mal, ob ich ein Bespiel für Merge in MySQL finde..

so long,
pi
pi314
pi314 11.01.2008 um 14:33:10 Uhr
Goto Top
Habe noch eine weitere Möglichkeit gefunden: ON DUPLICATE KEY UPDATE
http://dev.mysql.com/doc/refman/5.1/de/insert-on-duplicate.html

Du muss dazu allerdings deine Spalten A und B als PK oder Unique deklarieren.


Merge ist im SQL2003-Standard deklariert:
    MERGE INTO table_name USING table_name ON (condition)
    WHEN MATCHED THEN UPDATE SET column1 = value1 [, column2 = value2 ...]
    WHEN NOT MATCHED THEN INSERT column1 [, column2 ...] VALUES (value1 [, value2 ...]) 

Habe ein bisschen probiert, aber es nicht mit der gleichen Tabelle geschafft, dass da was vernünftiges rauskommt.

Also: verwende ON DUPLICATE KEY UPDATE face-wink

greetz,
pi
condor83
condor83 14.01.2008 um 06:38:38 Uhr
Goto Top
hey super - danke - werd mir das genauer anschauen!!!