MySQL UPDATE oder: Ich schon wieder

Servus!

Ich habe direkt noch ein weiteres Problem… (nicht hauen!!!)

Ich habe 2 Tabellen mit gleicher Struktur und gleichen Namen der insgesamt 50 spalten.
Ich würde gerne die Zieltabelle mit den Werten der Quelltabelle updaten. Es müssen dabei nicht alle Zeilen der einen in der anderen Tabelle vorkommen!
Gibts da eine Möglichkeit mit Subqueries?

UPDATE Zieltabelle Z, Quelltabelle Q SET
Z.wert1 = (SELECT Q.wert1 FROM Quelltabelle Q WHERE Q.ID = Z.ID),
...
Z.wert50 = (SELECT Q.wert50 FROM Quelltabelle Q WHERE Q.ID = Z.ID)
WHERE Z.ID = Q.ID

Kanns ja wohl nicht sein, oder (mal davon ab, dass ich mir fast sicher bin, dass das oben relativ keinen Sinn ergibt…)?

  • Kennt MYSQL den Befehl MERGE ? Das wäre dann die Lösung…

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

JEIN

  • Kennt MYSQL den Befehl MERGE ? Das wäre dann die Lösung…

http://dev.mysql.com/doc/refman/5.1/de/merge-storage…

Ich nutze allerdings InnoDB…

EDIT:

UPDATE Zieltabelle Z, Quelltabelle Q SET 
 Z.wert1 = Q.wert1,
 ...,
 Z.wert50 = Q.wert50
 WHERE Z.ID = Q.ID

führt zu: _Betroffene Datensätze: 0 _

  • Kennt MYSQL den Befehl MERGE ? Das wäre dann die Lösung…

http://dev.mysql.com/doc/refman/5.1/de/merge-storage…

Ich nutze allerdings InnoDB…

Nun, ich bin ein Oracle - Mensch, aber die MYSQL Doku sagt :

unter:

http://dev.mysql.com/doc/refman/5.1/en/insert.html

Folgendes Statement:

INSERT … ON DUPLICATE KEY UPDATE.

–> Dass sollte das Problem lösen

Gruss

Nein
Habe ich auch schon gesehen - die Syntax der ON DUPLICATE KEY UPDATE-Anweisung entspricht aber der der normalen UPDATE-Anweisung und bringt mich dadurch auch nicht weiter. Das wäre eher eine Zusatzfunktion, dass alle Werte, die noch nicht in der Zieltabelle enthalten sind, erstellt werden, und alle in der Zieltabelle vorhandenen werden durch Werte der Quelltabelle upgedatet…

ok…dann habe ich offensichtlich deine Anforderung nicht ganz mitbekommen :smile:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

Ich habe 2 Tabellen mit gleicher Struktur und gleichen Namen
der insgesamt 50 spalten.
Ich würde gerne die Zieltabelle mit den Werten der
Quelltabelle updaten.

könntest du uns ein bisschen Einblick in deinen DB-Entwurf geben? Mir fällt spontan kein Grund ein, warum man zwei Tabellen mit demselben Schema und größtenteils demselben Inhalt samt Primärschlüsselwerten haben möchte.

Vielleicht lässt sich dein Problem so an der Wurzel lösen, anstatt die Symptome zu bekämpfen.

Gruß,
Andreas

In eine Tabelle (Quelltabelle) werden Daten aus einer CSV-Datei per Skript eingelesen. Da die Datenqualität der CSV-Datei aber arg zu wünschen übrig lässt, müssen sie noch aufbereitet werden.
Mit der zweiten Tabelle (Zieltabelle) wird allerdings operativ gearbeitet, daher möchte ich erst die aufbereiteten Daten übergeben.
Die Tabellen haben nur im Moment (testweise) den gleichen Inhalt.

Aber unabhängig von der Intention und dem Aufbau der DB - gibt es unter MySQL keine Möglichkeit eine Tabelle mit Werten einer anderen Tabelle upzudaten?

Ah, also eine Art Data-Cleansing-Schritt. Ok, daran hatte ich gar nicht gedacht.

Aber unabhängig von der Intention und dem Aufbau der DB - gibt
es unter MySQL keine Möglichkeit eine Tabelle mit Werten einer
anderen Tabelle upzudaten?

Ich kenne MySQL nicht so gut, aber dieses (proprietäre) REPLACE-Statement sieht so aus, als würde es genau deinen Zweck erfüllen:
http://dev.mysql.com/doc/refman/6.0/en/replace.html (Es sei denn, du bekommst die in den Kommentaren geschilderten Probleme mit z.B. Fremdschlüsseln.)

replace into Zieltabelle
select \* from Quelltabelle

Gruß,
Andreas

führt zu: _Betroffene Datensätze:
0 _

Kann es sein, dass bei diesem Test die entsprechenden Inhalt in Quelle und Ziel schon gleich waren? Bei mir funktioniert dein Ansatz (auch wenn es bei 50 Spalten ein Riesen-Statement ergibt):

mysql\> select \* from source;
+----+------+------+------+
| id | a | b | c |
+----+------+------+------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 100 | 2 |
| 3 | 3 | 3 | 3 |
+----+------+------+------+
3 rows in set (0.00 sec)

mysql\> select \* from dest;
+----+------+------+------+
| id | a | b | c |
+----+------+------+------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 100 | 2 |
| 3 | 3 | 3 | 3 |
| 4 | 4 | 4 | 4 |
+----+------+------+------+
4 rows in set (0.00 sec)

mysql\> update source set b=42 where id = 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql\> update dest d, source s set d.a=s.a, d.b=s.b, d.c=s.c where d.id = s.id;
**Query OK, 1 row affected (0.00 sec)  
Rows matched: 3 Changed: 1 Warnings: 0**  

mysql\> update dest d, source s set d.a=s.a, d.b=s.b, d.c=s.c where d.id = s.id;
**Query OK, 0 rows affected (0.00 sec)  
Rows matched: 3 Changed: 0 Warnings: 0**  

mysql\> select \* from dest;
+----+------+------+------+
| id | a | b | c |
+----+------+------+------+
| 1 | 1 | 1 | 1 |
| 2 | 2 | 42 | 2 |
| 3 | 3 | 3 | 3 |
| 4 | 4 | 4 | 4 |
+----+------+------+------+
4 rows in set (0.01 sec)

Die Zählung der „betroffenen Datensätze“ (affected rows) hätte mich auch zunächst verwirrt; offenbar werde nur Sätze mit echten Veränderungen gezählt.

Andreas