C'est ce que j'ai essayé mais ça échoue:
alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;
Quelqu'un a-t-il un conseil?
C'est ce que j'ai essayé mais ça échoue:
alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;
Quelqu'un a-t-il un conseil?
Réponses:
Après avoir ajouté la colonne, vous pouvez toujours ajouter la clé primaire:
ALTER TABLE goods ADD PRIMARY KEY(id)
Quant à savoir pourquoi votre script ne fonctionnait pas, vous devez spécifier PRIMARY KEY, pas seulement le mot PRIMARY:
alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;
FIRSTaprès AUTO_INCREMENT, ce qui signifie que le idsera la première colonne du tableau déjà existant. Sinon, il sera mis à la fin du tableau tel qu'il est écrit maintenant, ce qui peut être un peu déroutant en faisant simpleSELECT * ...
Si vous souhaitez ajouter une contrainte de clé primaire à une colonne existante, toute la syntaxe précédemment répertoriée échouera.
Pour ajouter une contrainte de clé primaire à une colonne existante, utilisez le formulaire:
ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;
Si votre table est assez grande, mieux vaut ne pas utiliser l'instruction:
alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;
car il fait une copie de toutes les données dans une table temporaire, modifie la table, puis la copie à nouveau. Mieux vaut le faire manuellement. Renommez votre table:
rename table goods to goods_old;
créer une nouvelle table avec la clé primaire et tous les index nécessaires:
create table goods (
id int(10) unsigned not null AUTO_INCREMENT
... other columns ...
primary key (id)
);
déplacer toutes les données de l'ancienne table vers de nouvelles clés et index de désactivation pour accélérer la copie:
- UTILISEZ CECI POUR LES TABLES MyISAM :
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;
- UTILISEZ CECI POUR LES TABLES InnoDB :
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;
Il faut 2 000 secondes pour ajouter PK à une table avec ~ 200 millions de lignes.
Je ne sais pas si cela compte pour quelqu'un d'autre, mais je préfère la table des identifiants à la première colonne de la base de données. La syntaxe pour cela est:
ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;
Ce qui n'est qu'une légère amélioration par rapport à la première réponse. Si vous vouliez qu'il soit dans une position différente, alors
ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;
HTH, -ft
Utilisez cette requête,
alter table `table_name` add primary key(`column_name`);
Ce code fonctionne dans ma base de données mysql:
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;
Essaye ça,
alter table goods add column `id` int(10) unsigned primary key auto_increment
Pour moi, aucune des suggestions n'a fonctionné en me donnant les erreurs de syntaxe, alors j'ai juste essayé d'utiliser phpmyadmin (version 4.9.2), (10.4.10-MariaDB) et ajouté une idcolonne avec une clé primaire auto-incrémentée. IdLa colonne a été joliment ajoutée à partir du premier élément.
La sortie de la requête était:
ALTER TABLE table_nameADD idINT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY ( id);
Supprimez les guillemets pour fonctionner correctement ...
alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;