Duplikate entfernen und Primary Key in MySQL erstellen: Ein praktischer Leitfaden

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.

Schreibe einen Kommentar

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