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:
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:
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:
createtable goods (
id int(10) unsigned notnull AUTO_INCREMENT
... other columns ...primarykey(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:
SET UNIQUE_CHECKS=0;ALTERTABLE goods DISABLE KEYS;INSERTINTO goods (... your column names ...)SELECT... your column names FROM goods_old;ALTERTABLE goods ENABLE KEYS;SET UNIQUE_CHECKS=1;
SET AUTOCOMMIT =0;SET UNIQUE_CHECKS=0;SET FOREIGN_KEY_CHECKS=0;INSERTINTO 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:
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);
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 motPRIMARY
:la source
FIRST
aprèsAUTO_INCREMENT
, ce qui signifie que leid
sera 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 * ...
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:
la source
Si votre table est assez grande, mieux vaut ne pas utiliser l'instruction:
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:
créer une nouvelle table avec la clé primaire et tous les index nécessaires:
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 :
OU
- UTILISEZ CECI POUR LES TABLES InnoDB :
Il faut 2 000 secondes pour ajouter PK à une table avec ~ 200 millions de lignes.
la source
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:
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
HTH, -ft
la source
Utilisez cette requête,
la source
Ce code fonctionne dans ma base de données mysql:
la source
la source
Essaye ça,
la source
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
id
colonne avec une clé primaire auto-incrémentée.Id
La colonne a été joliment ajoutée à partir du premier élément.La sortie de la requête était:
ALTER TABLE
table_name
ADDid
INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id
);la source
Supprimez les guillemets pour fonctionner correctement ...
la source