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?
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?
Antworten:
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;
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 * ...
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;
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;
- 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 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
Verwenden Sie diese Abfrage,
alter table `table_name` add primary key(`column_name`);
Dieser Code funktioniert in meiner MySQL-Datenbank:
ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);
ALTER TABLE GOODS MODIFY ID INT(10) NOT NULL PRIMARY KEY;
Versuche dies,
alter table goods add column `id` int(10) unsigned primary key auto_increment
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);
Entfernen Sie Anführungszeichen, um ordnungsgemäß zu funktionieren ...
alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;