Wie füge ich einer MySQL-Tabelle einen Primärschlüssel hinzu?


103

Das habe ich versucht, aber es schlägt fehl:

alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;

Hat jemand einen Tipp?


11
Wenn etwas fehlschlägt , ist es immer eine gute Idee anzugeben, was fehlschlägt : Erhalten Sie eine Fehlermeldung? welcher ?
Pascal MARTIN

Ich denke, Fehlermeldung sieht aus wie: mehrere Primärschlüssel definiert
LMD

Antworten:


226

Nach dem Hinzufügen der Spalte können Sie jederzeit den Primärschlüssel hinzufügen:

ALTER TABLE goods ADD PRIMARY KEY(id)

Um festzustellen, warum Ihr Skript nicht funktioniert hat, müssen Sie PRIMARY KEYnicht nur das Wort angeben PRIMARY:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

Für mich heißt es: Dies würde mehrere Primärschlüssel definieren. Ich benutze InnoDB. Beachten Sie, dass ich bereits 3 davon habe.
LMD

2
Ich würde auf jeden Fall setzen FIRSTnach AUTO_INCREMENT, was bedeutet, dass die iderste Spalte der bereits vorhandenen Tabelle sein. Andernfalls wird es an das Ende der Tabelle gesetzt, wie es jetzt geschrieben ist, was etwas verwirrend sein kann, wenn man es einfach machtSELECT * ...
StefanK

So erhalten Sie einen ersten Platz in der neuen ID-Spalte
TipVisor

17

Vorhandene Spalte

Wenn Sie einer vorhandenen Spalte eine Primärschlüsseleinschränkung hinzufügen möchten, schlägt die zuvor aufgeführte Syntax fehl.

Verwenden Sie das folgende Formular, um einer vorhandenen Spalte eine Primärschlüsseleinschränkung hinzuzufügen:

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;

1
MySQL erkennt MODIFY nicht als richtige Anweisung (zumindest in XAMPP, InnoDB)
LMD

@LMD Auf welcher MySQL-Version bist du? (HINWEIS: Ich weiß, dass es zu dem Zeitpunkt funktioniert hat, als ich dies gepostet habe, und ich glaube, es war 5.6 ... aber ich kann mich nicht sicher erinnern)
MER

1
Wenn es für Sie, wie für mich, nicht funktioniert, ersetzen Sie MODIFY durch CHANGE und es wird funktionieren!
csr-nontol

12

Wenn Ihre Tabelle ziemlich groß ist, verwenden Sie besser nicht die folgende Anweisung:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

Da eine Kopie aller Daten in einer temporären Tabelle erstellt wird, ändern Sie die Tabelle und kopieren Sie sie dann zurück. Mach es besser manuell. Benennen Sie Ihre Tabelle um:

rename table goods to goods_old;

Erstellen Sie eine neue Tabelle mit dem Primärschlüssel und allen erforderlichen Indizes:

create table goods (
    id  int(10) unsigned not null AUTO_INCREMENT
    ... other columns ...
    primary key (id)
);

Verschieben Sie alle Daten aus der alten Tabelle in eine neue und deaktivieren Sie Schlüssel und Indizes, um das Kopieren zu beschleunigen:

- VERWENDEN SIE DIESES FÜR MyISAM- TABELLEN:

SET UNIQUE_CHECKS=0;
    ALTER TABLE goods DISABLE KEYS;
        INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
    ALTER TABLE goods ENABLE KEYS;
SET UNIQUE_CHECKS=1;

ODER

- VERWENDEN SIE DIES FÜR InnoDB- TABELLEN:

SET AUTOCOMMIT = 0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
    INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT; SET AUTOCOMMIT = 1;

Das Hinzufügen von PK zu einer Tabelle mit ~ 200 Mio. Zeilen dauert 2 000 Sekunden.


Ich war überrascht, wie lange ich suchen musste, um diese Antwort zu finden. Vielen Dank für diese hilfreichen Beispiele.
Ryan

4

Ich bin mir nicht sicher, ob dies für andere von Bedeutung ist, aber ich ziehe die ID-Tabelle der ersten Spalte in der Datenbank vor. Die Syntax dafür lautet:

ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

Das ist nur eine kleine Verbesserung gegenüber der ersten Antwort. Wenn Sie wollten, dass es sich in einer anderen Position befindet, dann

ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;

HTH, -ft


3

Verwenden Sie diese Abfrage,

alter table `table_name` add primary key(`column_name`);

2

Dieser Code funktioniert in meiner MySQL-Datenbank:

ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);


0

Versuche dies,

alter table goods add column `id` int(10) unsigned primary key auto_increment

0

Bei mir hat keiner der Vorschläge zu Syntaxfehlern geführt, daher habe ich nur versucht, phpmyadmin (Version 4.9.2), (10.4.10-MariaDB) zu verwenden und eine idSpalte mit automatisch inkrementiertem Primärschlüssel hinzuzufügen . IdSpalte wurde schön vom ersten Element hinzugefügt.

Die Ausgabe der Abfrage war:

ALTER TABLE table_nameADD idINT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY ( id);


-3

Entfernen Sie Anführungszeichen, um ordnungsgemäß zu funktionieren ...

alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.