Datenbank/Primärschlüssel nachträglich setzen

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Nicht jede Tabelle einer Datenbank braucht tatsächlich einen Primärschlüssel, gleichwohl sollten Sie stets einen Primärschlüssel vorsehen. Wenn Sie vergessen haben, einen Primärschlüssel zu setzen, können Sie ihn auch nachträglich setzen.

Voraussetzung

1. Die Tabelle enthält noch keinen Primärschlüssel.

2. Die Spalte, die zum Primärschlüssel werden soll, darf keine doppelten Werte enthalten. Das können Sie mit folgender Abfrage prüfen:

SELECT `id`, count(`id`) as `anzahl`
  FROM `tabelle` GROUP BY `id` HAVING `anzahl` > 1;

Es werden von allen Datensätzen der Tabelle die Werte aus der Spalte id gesucht, nach diesen gruppiert und ausgegeben, falls es mehr als einen Datensatz mit diesem Wert gibt.

Siehe auch: Datenbank/SQL-Grundlagen#GROUP_BY_-_Bilden_von_Teilmengen
Siehe auch: Datenbank/SQL-Grundlagen#HAVING_-_Filtern_von_aggregierten_Werten

Gibt es für diese Abfrage kein Ergebnis, so ist die Voraussetzung erfüllt, und Sie können (hier die Spalte `id`) nachträglich zum Primärschlüssel erklären.

Primärschlüssel anlegen

Wenn es in der Tabelle bereits eine Spalte gibt, die zum Primärschlüssel werden soll, kann diese mit dieser Abfrage geändert werden:

ALTER TABLE `tabelle` 
  CHANGE `id` `id` INT unsigned NOT NULL AUTO_INCREMENT, 
  ADD PRIMARY KEY (`id`);

Damit wird die Spalte id in einen numerischen Typ gewandelt, bekommt gleichzeitig die Eigenschaft AUTO_INCREMENT – damit neue Zeilen automatisch eine eindeutige ID bekommen – und die Spalte wird als Primärschlüssel definiert. Sollte bereits eine geeignete numerische Spalte existieren oder eine Spalten mit einem anderen Datentyp als Primärschlüssel verwendet werden, kann der CHANGE-Teil in der Abfrage auch weggelassen werden:

ALTER TABLE `tabelle` 
  ADD PRIMARY KEY `id` (`id`);

Damit wird ohne eine Änderung aus der Spalte id ein Primärschlüssel.

Sollte eine als Primärschlüssel geeignete Spalte ganz fehlen, lässt sich eine solche Spalte auch neu anlegen:

ALTER TABLE `tabelle` 
  ADD `id` INT unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

Die so angelegte Spalte hat die gleichen Eigenschaften wie die über die Abfrage oben geänderte Spalte. Durch das Schlüsselwort FIRST wird die neue Spalte als erste Spalte der Tabelle angelegt, mit AFTER `spalte` würde sie hinter der Spalte spalte angelegt werden.

Weblinks