Comment ajouter une clé primaire à une table MySQL?

103

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?

mysql_go
la source
11
Quand quelque chose échoue , c'est toujours une bonne idée de spécifier ce que signifie l' échec : obtenez-vous un message d'erreur? laquelle ?
Pascal MARTIN
Je suppose que le message d'erreur ressemble à: plusieurs clés primaires définies
LMD

Réponses:

226

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;
Le Scrum Meister
la source
Pour moi, cela dit: cela définirait plusieurs clés primaires. J'utilise InnoDB. Notez que j'en ai déjà 3.
LMD
2
Je mettrais certainement 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 * ...
StefanK
Comment obtenir une première place dans la nouvelle colonne `` ID ''
TipVisor
17

Colonne existante

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;
MER
la source
1
mysql ne reconnaît pas MODIFY comme une instruction correcte (au moins dans XAMPP, InnoDB)
LMD
@LMD Quelle version de mysql utilisez-vous? (REMARQUE: je sais que cela a fonctionné au moment où j'ai publié ceci et je crois que c'était 5,6 ... mais je ne me souviens pas avec certitude)
MER
1
Si à vous, comme pour moi, cela ne fonctionne pas remplacez MODIFY par CHANGE et cela fonctionnera!
csr-nontol le
12

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;

OU

- 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.

Denis Makarskiy
la source
J'ai été surpris de voir combien de temps j'avais besoin de chercher pour trouver cette réponse. Merci pour ces exemples utiles.
Ryan le
4

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

ftrotter
la source
3

Utilisez cette requête,

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

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`);
Michał Myszor
la source
1
ALTER TABLE GOODS MODIFY ID INT(10) NOT NULL PRIMARY KEY;
Vimit Patel
la source
0

Essaye ça,

alter table goods add column `id` int(10) unsigned primary key auto_increment
phponwebsites
la source
0

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);

av3000
la source
-3

Supprimez les guillemets pour fonctionner correctement ...

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