J'ai une table appelée provider
. J'ai trois colonnes appelées person
, place
, thing
. Il peut y avoir des personnes en double, des lieux en double et des choses en double, mais il ne peut jamais y avoir de combinaison personne-lieu-chose en double.
Comment pourrais-je ALTER TABLE pour ajouter une clé primaire composite pour cette table dans MySQL avec ces trois colonnes?
@Adrian Cornish a répondu correctement. Cependant, il y a une autre mise en garde à la suppression d'une clé primaire existante. Si cette clé primaire est utilisée comme clé étrangère par une autre table, vous obtiendrez une erreur en essayant de la supprimer. Dans certaines versions de mysql, le message d'erreur y était mal formé (à partir de 5.5.17, ce message d'erreur est toujours
Si vous souhaitez supprimer une clé primaire référencée par une autre table, vous devrez d'abord supprimer la clé étrangère dans cette autre table. Vous pouvez recréer cette clé étrangère si vous le souhaitez toujours après avoir recréé la clé primaire.
De plus, lors de l'utilisation de clés composites, l'ordre est important. Celles-ci
ce n'est pas la même chose. Ils imposent tous deux l'unicité sur cet ensemble de trois champs, mais du point de vue de l'indexation, il y a une différence. Les champs sont indexés de gauche à droite. Par exemple, considérez les requêtes suivantes:
B peut utiliser l'index de clé primaire dans l'instruction ALTER 1
A peut utiliser l'index de clé primaire dans l'instruction ALTER 2
C peut utiliser l'un des index
D ne peut utiliser aucun des index
A utilise les deux premiers champs de l'index 2 comme index partiel. Un ne peut pas utiliser l'index 1 car il ne connaît pas la partie intermédiaire de l'index. Cependant, il pourrait toujours être en mesure d'utiliser un index partiel sur une seule personne.
D ne peut utiliser aucun des index car il ne connaît personne.
Voir la documentation mysql ici pour plus d'informations.
la source
Vous voudrez peut-être simplement une CONTRAINTE UNIQUE. Surtout si vous avez déjà une clé de substitution. (exemple d'une clé de substitution déjà existante serait une seule colonne qui est un AUTO_INCREMENT)
Ci-dessous le code SQL pour une contrainte unique
la source
la source
Il est certainement préférable d'utiliser COMPOSITE UNIQUE KEY, comme l'a proposé @GranadaCoder, un exemple un peu délicat cependant:
ALTER IGNORE TABLE table_name ADD UNIQUES INDEX idx_name(some_id, another_id, one_more_id);
la source
ALTER TABLE table_name DROP PRIMARY KEY,ADD PRIMARY KEY (col_name1, col_name2);
la source