update: zwei Datenbanken, zwei Tabellen

starter_de

Grünschnabel
Hallo.

Ich habe:
- zwei Datenbanken mit je einer Tabelle

Ich will:
1. die Datensätze der beiden Tabellen werden miteinander verglichen.
2. bei identischen Datensätzen wird in der ersten Spalte der ersten Tabelle ein Wert aus der zweiten Tabelle übernommen.

Ich habe es mit dem folgenden Code probiert, jedoch erfolglos.
Code:
update db1.tab1 a
set a.feld1 = b.feld3 
where (
select b.feld3 
from db1.tab1 a, db2.tab2 b 
where a.feld2 = b.feld2 
AND a.feld3 = b.feld3
)

Über Umwege, indem ich den Code in zwei Einzelschritten aufteile (update und select getrennt), klappt es zwar, aber es ist halt keine elegante Lösung.

Nach Möglichkeit möchte ich keinen php-Script benutzen.

Habt Ihr eine Idee?
 
Zuletzt bearbeitet:
Ist vielleicht noch etwas umständlich aber so sollte es eigentlich gehen:
Code:
update db1.tab1 a
set a.feld1 = (
select b.feld3 
from db2.tab2 b 
where a.feld2 = b.feld2 
AND a.feld3 = b.feld3)
where EXISTS(
select b.feld3 
from db2.tab2 b 
where a.feld2 = b.feld2 
AND a.feld3 = b.feld3
)
 
Danke für die Antwort, aber leider bekomme ich bei Deinem Code ebenfalls einen Syntaxfehler angezeigt.
Kann man überhaupt den Befehlt update über zwei Datenbanken nutzen?
 
Was für einen Syntaxfehler denn?
Wäre schön wenn Du den immer gleich mit postest.
Mir fällt gerade ein, er könnte meckern, dass mit dem Select im SET mehr als ein Wert (eine Tabelle) zurückgegeben wird. Da könnte ein DISTINCT abhelfen:
Code:
...
set a.feld1 = (
select DISTINCT b.feld3
...
mySQL 4 sollte ja ansich Subqueries unterstützen.
Und Du Updatest ja nur eine Tabelle - auch wenn Du Dir dazu informationen aus einer zweiten holst.
Ansonsten poste doch einfach mal immer die Fehlerbeschreibung mit.
 
Hallo!

Subquerys werden leider erst ab MySQL 4.1 unterstützt:

Starting with MySQL 4.1, all subquery forms and operations that the SQL standard requires are supported, as well as a few features that are MySQL-specific.
http://dev.mysql.com/doc/mysql/en/Subqueries.html

Zum Updaten meherer Tabellen gleichzeitig siehe:
Starting with MySQL 4.0.4, you can also perform UPDATE operations that cover multiple tables:

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
http://dev.mysql.com/doc/mysql/en/UPDATE.html

Gruß Tom
 
Nochmals danke für die Antworten.

Was den Syntaxfehler betrifft:
"[localhost] FEHLER 1064: You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'select a.id,a.ps,b.temp7 as variable from ppdb.ptab1 a
inner"

Naja, diese Aussage hilft mir nicht entscheidend weiter.

Aber nicht so schlimm, weil ich jetzt beschlossen habe, die zu Beginn erwähnte update-Query in zwei Schritten zu machen (zuerst mit select eine extra Tabelle erstellen, dann erst updaten - nicht elegant, aber es geht.)

Aber eine anschliessende Frage:
Es handelt sich bei mir um zwei Tabellen mit jeweils ca. 150.000 Datensätze, die wie gesagt, verglichen werden müssen.

Alleine diese Query hat auf meinem Rootserver 11 Stunden (!) gebraucht. Ist das bei der Menge normal? Es müsste doch schneller gehen...
Code:
CREATE TABLE IF NOT EXISTS db1.tab2;
select a.feld1,a.feld2,b.feld1 from db1.tab1 a
inner join db2.tab2 b
on a.feld1 = b.feld1
AND a.feld2 = b.feld2
WHERE a.feld3 = b.feld3

Habt Ihr eine Idee?
 
Code:
create...
select b.feld3 
from db1.tab1 a, db2.tab2 b 
where a.feld2 = b.feld2 
AND a.feld3 = '1'
AND b.feld3 = '1'

insert...
select b.feld3 
from db1.tab1 a, db2.tab2 b 
where a.feld2 = b.feld2 
AND a.feld3 = '2'
AND b.feld3 = '2'

Durch die Zuweisung von Konstanten in der WHERE-Bedingung konnte ich die Abfrage um fast Faktor 6 beschleunigen (zuvor über 11 Stunden bei ca. 150.000 Datensätze und jetzt knapp 2 Stunden).

Natürlich muss man das Glück haben Konstanten in Tabellen zu haben, die man sinnvoll einsetzen kann.
 
Also ich hoffe jetzt das ich die Frage nicht falsch verstanden hab. Wenn nicht wie wäre es denn dann mit diesem Code:

Code:
Update t1
   set t1.feld1 = b.feld3
  FROM db1.tab1 t1 INNER JOIN db2.tab2 t2
                      ON t1.feld2 = t2.feld2
                     AND t1.feld3 = t2.feld3

Ich weis nicht genau ob es funktioniert im 4.0, weil ich keinen zum testen hab und mir nicht sicher bin ob JOINs schon benutzt werden können.

MFG Dragon
 
Zurück