Supprimer la clé primaire dans MySQL

182

J'ai le schéma de table suivant qui mappe user_customers aux autorisations sur une base de données MySQL en direct:

mysql> describe user_customer_permission;
+------------------+---------+------+-----+---------+----------------+
| Field            | Type    | Null | Key | Default | Extra          |
+------------------+---------+------+-----+---------+----------------+
| id               | int(11) | NO   | PRI | NULL    | auto_increment |
| user_customer_id | int(11) | NO   | PRI | NULL    |                |
| permission_id    | int(11) | NO   | PRI | NULL    |                |
+------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

Je voudrais supprimer les clés primaires pour user_customer_id et permission_id et conserver la clé primaire pour id.

Quand j'exécute la commande:

alter table user_customer_permission drop primary key;

J'obtiens l'erreur suivante:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

Comment puis-je supprimer la clé primaire d'une colonne?

markb
la source

Réponses:

286

Sans index, la gestion d'une colonne à auto-incrémentation devient trop coûteuse, c'est pourquoi MySQLune colonne à auto-incrémentation doit être la partie la plus à gauche d'un index.

Vous devez supprimer la propriété d'auto-incrémentation avant de supprimer la clé:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;

Notez que vous avez un composite PRIMARY KEYqui couvre les trois colonnes et idn'est pas garanti pour être unique.

S'il est unique, vous pouvez en faire un PRIMARY KEYet AUTO_INCREMENTencore:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;
Quassnoi
la source
Ne devrais-je pas alors restaurer la colonne id en tant que clé primaire auto_increment? alter table user_customer_permission add primary key (id); alter table user_customer_permission change id id int (11) auto_increment;
markb
@markb: si vous restaurez la clé primaire, vous pouvez certainement la rétablir AUTO_INCREMENT.
Quassnoi
qu'est-ce que cela signifie que la colonne d'auto - incrémentation est une partie la plus à gauche de la clé primaire. ?
Arup Rakshit
1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/… Pour utiliser le AUTO_INCREMENTmécanisme avec une table InnoDB, une AUTO_INCREMENTcolonne ai_coldoit être définie dans le cadre d'un index de sorte qu'il soit possible d'effectuer l'équivalent d'une SELECT MAX(ai_col)recherche indexée sur la table pour obtenir la valeur maximale de la colonne. En règle générale, cela est réalisé en faisant de la colonne la première colonne d'un index de table.
Quassnoi
il dit que PRIMAIRE n'est pas défini. Pourquoi cela se produit? J'ai donc dû supprimer et ajouter à nouveau la colonne ID sans spécifier de clé primaire
mrbengi
121

Une ligne:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )

Vous ne perdrez pas non plus l'incrémentation automatique et devrez le rajouter, ce qui pourrait avoir des effets secondaires.

mluebke
la source
5
Je pense que cette réponse doit flotter vers le haut car non seulement elle supprime le besoin de changer la définition du champ, mais elle permet également le changement avec les contraintes fk sur la table en cours de modification - m'a vraiment aidé!
tomfumb
Parfait! Pour moi, la suppression de la clé primaire ne fonctionnait pas, même si je modifie le champ pour me débarrasser de l'incrémentation automatique. Mais cette solution fonctionne bien!
user2447161
14

Je pense que Quassnoi a répondu à votre question directe. Juste une remarque: peut-être que ce n'est qu'une formulation maladroite de votre part, mais vous semblez avoir l'impression que vous avez trois clés primaires, une sur chaque champ. Ce n'est pas le cas. Par définition, vous ne pouvez avoir qu'une seule clé primaire. Ce que vous avez ici est une clé primaire composée de trois champs. Ainsi, vous ne pouvez pas "déposer la clé primaire sur une colonne". Vous pouvez supprimer la clé primaire ou ne pas supprimer la clé primaire. Si vous voulez une clé primaire qui n'inclut qu'une seule colonne, vous pouvez déposer la clé primaire existante sur 3 colonnes et créer une nouvelle clé primaire sur 1 colonne.

Geai
la source
11
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;
Alix Axel
la source
7

Si vous avez une clé primaire composite, faites comme ceci: ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);

Visvendra Singh Rajpoot
la source
5

"si vous restaurez la clé primaire, vous pouvez certainement la rétablir à AUTO_INCREMENT"

Il ne devrait pas être question de savoir s'il est souhaitable ou non de «restaurer la propriété PK» et de «restaurer la propriété d'auto-incrémentation» de la colonne ID.

Étant donné qu'il s'agissait d'un auto-incrémentation dans la définition précédente de la table, il est fort probable qu'il existe un programme qui s'insère dans cette table sans fournir de valeur d'ID (car la colonne ID est de toute façon auto-incrémentée).

Toute opération de ce programme sera interrompue en ne restaurant pas la propriété d'auto-incrémentation.

Erwin Smout
la source
3

Commencez par modifier la colonne pour supprimer le champ auto_increment comme ceci: alter table user_customer_permission modifier id de colonne int;

Ensuite, déposez la clé primaire. alter table user_customer_permission drop clé primaire;

John Gunderman
la source
2
ALTER TABLE `table_name` ADD PRIMARY KEY( `column_name`);
Malith Ileperuma
la source
1

J'ai eu le même problème et à côté de certaines valeurs à l'intérieur de ma table. Bien que j'ai changé ma clé primaire avec

ALTER TABLEuser_customer_permission DROP PRIMARY KEY , ADD PRIMARY KEY (id)

le problème a continué sur mon serveur. J'ai créé un nouveau champ à l'intérieur de la table, j'ai transféré les valeurs dans un nouveau champ et supprimé l'ancien, problème résolu !!

Sam
la source
1

Pour ajouter une clé primaire dans la colonne.

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

Pour supprimer la clé primaire de la table.

ALTER TABLE table_name DROP PRIMARY KEY;
sumit katiyar
la source
0

Sauvegardez d'abord la base de données. Supprimez ensuite toute clé étrangère associée à la table. tronquer la table de clé étrangère.Truncate la table actuelle. Supprimez les clés primaires requises. Utilisez sqlyog ou workbench ou heidisql ou dbeaver ou phpmyadmin.

Noby Nirmal
la source
0

Recherchez la table dans le gestionnaire SQL, cliquez dessus avec le bouton droit de la souris et sélectionnez le design, puis cliquez avec le bouton droit sur l'icône de la petite clé et sélectionnez supprimer la clé primaire.

Noob Helper
la source
Bien que cet article puisse résoudre la question, inclure une capture d'écran aide vraiment à améliorer la qualité de votre article. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir et que ces personnes ne connaissent peut-être pas la même interface utilisateur que vous.
Pirate X