MySQL - TempTabelle in MainTabelle übernehmen

freshman2017
Goto Top
Guten Tag liebe Gemeinde,

ich stehe "mal" wieder auf dem Schlauch. Ich würde gerne in MySQL Daten aus einer Temp Tabelle in eine Main Tabelle schreiben und zwar Updaten, wenn der Eintrag Anhand einer ID vorhanden ist und neu einfügen, wenn es diesen noch nicht gibt.

Aus MSSQL kenne ich es wie folgt:



Wie stelle ich es am besten bei MySQL an?
Mit den besten Grüßen aus dem Süden!

Content-Key: 2893757414

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

Ausgedruckt am: 27.06.2022 um 12:06 Uhr

Mitglied: ukulele-7
ukulele-7 25.05.2022 um 15:02:36 Uhr
Goto Top
Wenn MySQL kein MERGE kann ganz klassisch, mit UPDATE oder INSERT. Dazu kannst du etwa wie folgt vorgehen:
In deinem MERGE macht übrigens ID im UPDATE Teil keinen Sinn, das kann ja nicht abweichend sein, darauf wird ja gejoint - nur der Vollständigkeit halber.

Unter MSSQL hatte ich auch kuriose Dinge mit MERGE gesehen daher verfahre ich eigentlich immer so. Zumal ich den UPDATE Teil auch für jeden Wert gesondert durchführen kann und dann auch nur dieser Wert angefasst wird. Kann bei aktiven Log-Triggern sinnvoll sein.
Mitglied: ukulele-7
ukulele-7 25.05.2022 um 15:05:28 Uhr
Goto Top
Ergänzend kann man auch noch andere Wege nutzen, beim INSERT könnte man auch mit EXCEPT arbeiten, aber auch das ist ja vielleicht nicht überall gegeben. Wichtig ist die Reihenfolge, erst UPDATE auf den Bestand und dann neue Datensätze. Wenn alles in einer Transaktion laufen muss dürfte das auch gehen, ist aber vielleicht gar nicht nötig.
Mitglied: sabines
sabines 25.05.2022 um 17:09:51 Uhr
Goto Top
Moin,

ich werfe mal insert on duplicate key update in den Raum
https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html

Grüße
Mitglied: LordGurke
LordGurke 26.05.2022 um 13:37:48 Uhr
Goto Top
Statt "INSERT INTO" kannst du auch "REPLACE INTO" benutzen - syntaktisch verhalten die sich identisch.
Wenn der Primärschlüssel vorhanden ist, wird MySQL dann den Eintrag akutalisieren.
Mitglied: freshman2017
freshman2017 26.05.2022 aktualisiert um 17:45:42 Uhr
Goto Top
Hallo,
wie würde denn der SQL Befehl dazu aussehen? Wenn die Daten aus der temp in die Main kopiert werden sollen?

Ich habe eine Tabelle test und eine Tabelle test_temp mit dem gleichen Aufbau. (Felder: adrnr,vname,nname). Der Primärschlüssel ist bei mir die „adrnr“.

Zitat von @LordGurke:

Statt "INSERT INTO" kannst du auch "REPLACE INTO" benutzen - syntaktisch verhalten die sich identisch.
Wenn der Primärschlüssel vorhanden ist, wird MySQL dann den Eintrag akutalisieren.

Mitglied: LordGurke
Lösung LordGurke 26.05.2022 um 18:00:32 Uhr
Goto Top
Das müsste dann (ungetestet) gehen mit:

So würde es zumindest mit einem reinen INSERT gehen, aber REPLACE sollte sich identisch verhalten.
Mitglied: freshman2017
Lösung freshman2017 27.05.2022 um 10:06:03 Uhr
Goto Top
Das mit dem INSERT klappt wunderbar, beim Update bekomme ich noch eine Fehlermeldung, woran kann es liegen?


Zitat von @ukulele-7:

Wenn MySQL kein MERGE kann ganz klassisch, mit UPDATE oder INSERT. Dazu kannst du etwa wie folgt vorgehen:
In deinem MERGE macht übrigens ID im UPDATE Teil keinen Sinn, das kann ja nicht abweichend sein, darauf wird ja gejoint - nur der Vollständigkeit halber.

Unter MSSQL hatte ich auch kuriose Dinge mit MERGE gesehen daher verfahre ich eigentlich immer so. Zumal ich den UPDATE Teil auch für jeden Wert gesondert durchführen kann und dann auch nur dieser Wert angefasst wird. Kann bei aktiven Log-Triggern sinnvoll sein.

Mitglied: ukulele-7
Lösung ukulele-7 27.05.2022 um 10:49:50 Uhr
Goto Top
Also wenn dann macht das hier keinen Sinn:
sondern nur:
UPDATE ... FROM mit JOIN ist eventuell auch nicht zulässig bei MySQL, da bin ich mir nicht sicher.