Suchen-und-Ersetzen mit MySQL-Datenbanken

Vor ein paar Tagen musste ich ca. 1000 Datensätze, die fehlerhaft in eine Datenbank geschrieben wurden überarbeiten. In einer Spalte, die Links enthält musste die Toplevel-Domain von .de auf .com geändert werden. Bis zu diesem Zeitpunkt war ich der Meinung, dass es nicht möglich ist ein Suchen-und-Ersetzen auf MySQL-Tabellen mit einem einfachen SQL-Statement durchzuführen. In der Regel habe ich daher die Tabelle mit einem Programm wie Access verbunden und dort die Suchen-und-Ersetzen Funktion genutzt.

Die Lösung für das Problem war allerdings recht simpel. Ich habe für Abfragen schon mehrfach die REPLACE() Funktion von MySQL benutzt, die wie folgt definiert ist:

REPLACE(str,from_str,to_str)

Bisher habe ich aber die Funktion lediglich in einer Abfrage einsetzt, um direkt in einer Abfrage bestimmte Umformungen durchzuführen, um z.B. nach den geänderten Wörtern gruppieren oder sortieren zu können. Die REPLACE Funktion, die es auch schon in MySQL 4.1 gab, kann einem aber auch dabei helfen die Texte einer Spalte zu aktualisieren. Die Syntax für eine Suchen-und-Ersetzen-Abfrage sieht wie folgt aus:

UPDATE [Tabellenname] SET [Spaltenname] = REPLACE([Spaltenname], [Suchwort], [Ersetzung])

Hierbei muss wie von vielen Programmen gewöhnt nicht das gesamte Wort ersetzen werden. Wenn in einer Spalte das Suchwort meh als einmal gefunden wird, wird es auch mehrfach ersetzt. Zusätzlich kann in dem Update Statement natürlich auch ein WHERE Statement eingebaut werden, um nicht alle Einträge einer Tabelle zu aktualisieren. Nehmen wir also an, es gibt eine Tabelle blogroll mit Links. In dieser wollen wir alle Links von .com auf .de ändern, aber keine Links, die auf example.com zeigen. Das Statement hierfür sieht dann wie folgt aus:

UPDATE blogroll SET link = REPLACE(link, '.com', '.de') WHERE link NOT LIKE '%example.com%'

Ihr könnt somit sehr einfach in einer Tabelle Werte durch andere ersetzen. Ihr könnt hierbei als Ersetzung auch weitere Funktionen nutzen wir z.B. die CONCAT() Funktion mit der sich Texte oder Spalten zusammensetzen lassen.

Aber ihr müsst wie immer sehr vorsichtig mit UPDATE Statements umgehen, denn ein STRG + Z zum Rückgängigmachen der Aktion gibt es nicht. Solltet ihr also nicht sicher sein, ob das Statement korrekt ist, gebt das Ergebnis der umformung zuerst mit einem SELECT Statement aus:

SELECT link, REPLACE(link, '.com', '.de') AS new_link FROM blogroll WHERE link NOT LIKE '%example.com%'

Am sichersten ist es natürlich, wenn ihr die Daten der Tabelle vorher in einem SQL-Dump speichert. Ich hoffe dass der Tipp euch dabei helfen wird, wenn ihr mal ein ähnliches Problem habt. Ich war ja bisher der Meinung, dass ich solche Ersetzungen immer nur auf einem Dump der Daten in einem Texteditor schnell durchführen kann, aber nun werde ich diesen Trick vermutlich häufiger einsetzen.

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugins, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

2 Kommentare » Schreibe einen Kommentar

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert