Als Webentwickler stoßen wir oft auf Datenbankprobleme, die eine clevere Lösung erfordern. Heute möchte ich einen häufigen Fall behandeln: Das Entfernen von Duplikaten und das Erstellen eines zusammengesetzten Primary Keys in einer bestehenden MySQL-Tabelle.
Das Problem
Stellen wir uns folgende Situation vor: Wir haben eine Tabelle sys_category_record_mm, die Beziehungen zwischen Kategorien und Datensätzen speichert. Die Struktur sieht so aus:
CREATE TABLE `sys_category_record_mm` (
`uid_local` int(10) UNSIGNED NOT NULL DEFAULT 0,
`uid_foreign` int(10) UNSIGNED NOT NULL DEFAULT 0,
`tablenames` varchar(64) NOT NULL DEFAULT ‚‘,
`sorting` int(10) UNSIGNED NOT NULL DEFAULT 0,
`sorting_foreign` int(10) UNSIGNED NOT NULL DEFAULT 0,
`fieldname` varchar(64) NOT NULL DEFAULT ‚'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
Unser Ziel ist es, einen zusammengesetzten Primary Key aus uid_local und uid_foreign zu erstellen. Das Problem: Es gibt Duplikate in der Tabelle, die dies verhindern.
Die Lösung
Hier ist eine Schritt-für-Schritt-Lösung:
- Erstellen einer temporären Tabelle mit eindeutigen Einträgen
- Löschen der alten Tabelle
- Umbenennen der temporären Tabelle
- Hinzufügen des Primary Keys
Der SQL-Code
— 1. Erstellen einer temporären Tabelle mit eindeutigen Einträgen
CREATE TABLE temp_sys_category_record_mm AS
SELECT DISTINCT uid_local, uid_foreign, tablenames,
MIN(sorting) as sorting,
MIN(sorting_foreign) as sorting_foreign,
fieldname
FROM sys_category_record_mm
GROUP BY uid_local, uid_foreign, tablenames, fieldname;
— 2. Löschen der alten Tabelle
DROP TABLE sys_category_record_mm;
— 3. Umbenennen der temporären Tabelle
ALTER TABLE temp_sys_category_record_mm RENAME TO sys_category_record_mm;
— 4. Hinzufügen des Primary Keys
ALTER TABLE sys_category_record_mm
ADD PRIMARY KEY (uid_local, uid_foreign);
— Optional: Setzen der Spaltentypen und Defaults
ALTER TABLE sys_category_record_mm
MODIFY uid_local int(10) UNSIGNED NOT NULL DEFAULT 0,
MODIFY uid_foreign int(10) UNSIGNED NOT NULL DEFAULT 0,
MODIFY tablenames varchar(64) NOT NULL DEFAULT ‚‘,
MODIFY sorting int(10) UNSIGNED NOT NULL DEFAULT 0,
MODIFY sorting_foreign int(10) UNSIGNED NOT NULL DEFAULT 0,
MODIFY fieldname varchar(64) NOT NULL DEFAULT ‚‘;
Erklärung
Diese Lösung entfernt Duplikate, indem sie nur eindeutige Kombinationen von uid_local, uid_foreign, tablenames und fieldname behält. Für sorting und sorting_foreign wird jeweils der kleinste Wert verwendet.
Wichtiger Hinweis
Bevor Sie dieses Skript ausführen, erstellen Sie unbedingt ein Backup Ihrer Daten. Solche Änderungen sind nicht rückgängig zu machen, und es ist immer besser, auf der sicheren Seite zu sein.
Fazit
Mit dieser Methode können Sie effektiv Duplikate aus Ihrer MySQL-Tabelle entfernen und einen zusammengesetzten Primary Key erstellen. Dies verbessert nicht nur die Datenintegrität, sondern auch die Performance Ihrer Datenbank.