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?


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;

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;

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.


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


3

Utilisez cette requête,

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

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


0

Essaye ça,

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

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


-3

Supprimez les guillemets pour fonctionner correctement ...

alter table goods add column id int(10) unsigned primary KEY AUTO_INCREMENT;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.