Sonntag, 11. Mai 2008

MySQL INSERTs und UPDATEs mit Subselects

Kürzlich durfte ich nachträglich zwei Datenbanktabelle normalisieren. Obwohl ich längst von den Subselect-Fähigkeiten von MySQL wusste, hatte ich es bis dato noch nie ausprobiert. Wie es sich herausgestellt hat, ist das Prozedere deutlich einfacher, als ich es mir erträumt hatte.

Rubriken neu in separater Tabelle

Die Tabelle daten enthält bspw. Adressen, die jeweils einer bestimmten Rubrik zugewiesen sind. Selbstverständlich kann man die Rubrik in dieselbe Tabelle hardcoden – doch deutlich hübscher ist es, die Rubrik in eine eigene Tabelle auszulagern und diese mittels eines Foreign Keys zu verknüpfen. Einer der Vorteile: Muss der Name einer Rubrik angepasst werden, geschieht dies an einem einzigen Ort, die Änderung wird aber gleich für alle Adressen übernommen.

Folgender Befehl nahm die hardcodierten Rubriken und fügte diese (jeweils einmal!) in die Tabelle rubriken ein:

INSERT INTO daten_rubriken
(rubrik)
SELECT DISTINCT(rubrik) FROM daten

Wichtig ist die SELECT ... Klausel – bis dahin handelt es sich beim SQL-Query um einen ganz normalen INSERT. DISTINCT bewirkt, dass der Rubrikennamen nur einmal ausgelesen wird (es können ja dutzende oder tausende Einträge dieselbe Rubrik haben).

Rubriken-IDs in Ursprungstabelle

Nachdem wir also nun die Rubriken in eine eigene Tabelle ausgelagert haben, möchten wir diese wieder mit der Ursprungstabelle verknüpfen. Hierzu verknüpfen wir die Textfelder der Ursprungs- mit der Rubriken-Tabelle und fügen in die Ursprungstabelle in ein neu erstelltes Feld die ID der Rubrik ein:

UPDATE daten d
SET d.`daten_rubriken-id` = (SELECT r.id FROM daten_rubriken r WHERE r.rubrik = s.rubrik)

Liked this post? Follow this blog to get more. 

Tags: , ,
Labels: Allgemein

Ein Kommentar Kommentare

EUMIDO sagt:

Hallo! Bin ein mySQL-Neuling und habe ein Problem mit dem folgendem Befehl:

update uploads set iduser=5 where uploadid =(select max(uploadid) from uploads)

You can’t specify target table ‚uploads‘ for update in FROM clause

Fehlernr:1093

Sieht jemand den Fehler?

Kommentar erfassen