220 votes

Supprimer la clé primaire dans MySQL

J'ai le schéma de table suivant qui associe user_customers aux permissions sur une base de données MySQL active :

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 je lance la commande :

alter table user_customer_permission drop primary key;

Je reçois 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 ?

351voto

Quassnoi Points 191041

Sans index, la maintenance d'une colonne autoincrémentée devient trop coûteuse, c'est pourquoi MySQL exige qu'une colonne autoincrémentée soit la partie la plus à gauche d'un index.

Vous devez supprimer la propriété d'auto-incrémentation avant de laisser tomber 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 KEY qui couvre les trois colonnes et id n'est pas garanti comme étant unique.

S'il s'agit d'une pièce unique, vous pouvez en faire une PRIMARY KEY et AUTO_INCREMENT encore :

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

0 votes

Ne faudrait-il pas alors restaurer la colonne id comme clé primaire à incrémentation automatique ? alter table user_customer_permission add primary key (id) ; alter table user_customer_permission change id int(11) auto_increment ;

0 votes

@markb : si vous restaurez la clé primaire, vous pouvez bien sûr la rétablir en AUTO_INCREMENT .

2 votes

Qu'est-ce que cela signifie pour être la partie la plus à gauche de la PRIMARY KEY. ?

145voto

mluebke Points 2588

Une ligne :

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

Vous ne perdrez pas non plus l'auto-incrément et ne devrez pas le réinsérer, ce qui pourrait avoir des effets secondaires.

6 votes

Je pense que cette réponse doit être mise en avant car non seulement elle supprime la nécessité de modifier la définition du champ, mais elle permet également de modifier les contraintes fk sur la table en cours de modification - cela m'a vraiment aidé !

0 votes

Parfait ! Pour moi, la suppression de la clé primaire ne fonctionnait pas, même si je modifiais le champ pour supprimer l'incrémentation automatique. Mais cette solution fonctionne parfaitement !

16voto

Jay Points 14781

Je crois que Quassnoi a répondu à votre question directe. Juste une remarque : peut-être est-ce une formulation maladroite de votre part, mais vous semblez avoir l'impression que vous avez trois clés primaires, une pour 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 qui est un composite de trois champs. Ainsi, vous ne pouvez pas "déposer la clé primaire sur une colonne". Vous pouvez déposer la clé primaire, ou ne pas déposer la clé primaire. Si vous voulez une clé primaire qui ne comprend 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.

13voto

Alix Axel Points 63455
ALTER TABLE `user_customer_permission` MODIFY `id` INT;
ALTER TABLE `user_customer_permission` DROP PRIMARY KEY;

5voto

Erwin Smout Points 7499

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

La 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 ne devrait pas se poser.

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

Le fonctionnement d'un tel programme sera interrompu par la non-restauration de la propriété d'auto-incrémentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X