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?

mysql_go
quelle
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;
Der Scrum Meister
quelle
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;
MER
quelle
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.

Denis Makarskiy
quelle
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

ftrotter
quelle
3

Verwenden Sie diese Abfrage,

alter table `table_name` add primary key(`column_name`);
RATAN KUMAR
quelle
2

Dieser Code funktioniert in meiner MySQL-Datenbank:

ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);
Michał Myszor
quelle
1
ALTER TABLE GOODS MODIFY ID INT(10) NOT NULL PRIMARY KEY;
Vimit Patel
quelle
0

Versuche dies,

alter table goods add column `id` int(10) unsigned primary key auto_increment
phponwebsites
quelle
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);

av3000
quelle
-3

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

alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;
Raja Muthukutty
quelle