2010-04-15 7 views
18

J'essaie d'apprendre à utiliser les touches et de ne pas avoir l'habitude d'avoir des ID de type SERIAL pour toutes les lignes de toutes mes tables. En même temps, je fais aussi des relations plusieurs-à-plusieurs, et donc exiger des valeurs uniques sur chaque colonne des tables qui coordonnent les relations entraverait cela.Clé primaire multi-colonne dans MySQL 5

Comment puis-je définir une clé primaire sur une table de sorte qu'une valeur donnée puisse être répétée dans n'importe quelle colonne, tant que la combinaison de valeurs sur toutes les colonnes n'est jamais répétée exactement?

+0

Copie possible de [Comment créer correctement les clés primaires composites - MYSQL] (http://stackoverflow.com/questions/5835978/how-to-properly-create-composite-primary-keys-mysql) –

+0

Impossible de être un duplicata de quelque chose posté 3 ans plus tard. – Kaji

+0

http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-its-much-newer-and-ha ;-) –

Répondre

39

Cité de la page CREATE TABLE Syntax:

Une clé primaire peut être un multiple colonnes indice . Toutefois, vous ne pouvez pas créer un index à plusieurs colonnes à l'aide de l'attribut de clé PRIMARY KEY dans une spécification de colonne . Cela ne marque que cette seule colonne comme primaire. Vous devez utiliser une clause distincte PRIMARY KEY (index_col_name, ...).

Quelque chose comme cela peut être utilisé pour les clés primaires à plusieurs colonnes:

CREATE TABLE 
    product (
     category INT NOT NULL, 
     id INT NOT NULL, 
     price DECIMAL, 
     PRIMARY KEY(category, id) 
    ); 

De 13.6.4.4. FOREIGN KEY Constraints

+0

Shouldn ' t vous incluez le prix dans le PK (catégorie, id, prix) de votre exemple? Il demande «n'importe quelle colonne» et «à travers toutes les colonnes»? ... et ensuite ajouter un commentaire sévère à propos de ce être sous-optimal, lent et jamais nécessaire dans la vraie vie? (OUI! Je suis nitpicking ici :-) – lexu

+0

Je suis d'accord. Toutes les colonnes devraient être là – fiacobelli

+0

Ne fonctionne pas du tout dans mon cas. Par exemple, si j'utilise une catégorie différente, mais le même identifiant, montre toujours la clé dupliquée. –

17

clé primaire est un concept de domaine unique (nécessairement et suffisamment) identifie votre entité parmi des entités similaires. Une clé primaire composite (plusieurs colonnes) n'a de sens que lorsqu'une partie de la clé fait référence à une instance particulière d'une autre entité de domaine. Disons que vous avez une collection personnelle de livres.

Tant que vous êtes seul, vous pouvez les compter et leur attribuer un numéro. Le numéro est la clé primaire du domaine de votre bibliothèque.

Maintenant vous voulez fusionner votre bibliothèque avec celle de votre voisin tout en étant capable de distinguer à qui appartient un livre. Le domaine est maintenant plus large et la clé primaire est maintenant (owner, book_id). Ainsi, faire de chaque composite clé primaire ne devrait pas être votre stratégie, mais plutôt vous devriez l'utiliser lorsque cela est nécessaire.

Maintenant quelques faits sur MySQL. Si vous définissez une clé primaire composite et souhaitez que le RDBSM auto-incrémente les ID pour vous, vous devez connaître la différence entre le comportement MyISAM et InnoDB. Supposons que nous voulions une table avec deux champs: parent_id, child_id. Et nous voulons que le child_id soit auto-incrémenté. MyISAM s'autoincrémente automatiquement dans les enregistrements avec le même parent_id et InnoDB s'autoincrémente de manière unique dans la table entière. Dans MyISAM, vous devez définir la clé primaire comme (parent_id, child_id) et dans InnoDB comme (child_id, parent_id), car le champ auto-incrémenté doit être le constituant le plus à gauche de la clé primaire dans InnoDB.

+1

Ceci est une réponse exceptionnelle. – Dakatine

1

La clé primaire est une valeur unique pour la ligne. Cela n'a aucun sens d'inclure le prix, une valeur qui pourrait changer. Imaginez si vous deviez changer une large gamme de prix, alors toutes ces valeurs de clé primaire changeraient. Quel gâchis ce serait!

Questions connexes