web-dev-qa-db-fra.com

Clé primaire multicolonne dans MySQL 5

J'essaie d'apprendre à utiliser les clés et à rompre l'habitude d'avoir nécessairement 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 l'une ou l'autre des colonnes des tables qui coordonnent les relations entraverait cela.

Comment définir une clé primaire sur une table de sorte qu'une valeur donnée puisse être répétée dans une colonne, tant que la combinaison de valeurs dans toutes les colonnes ne se répète jamais exactement?

20
Kaji

Citation de la page syntaxe CREATE TABLE :

Une clé primaire peut être une colonne multiple indice. Cependant, vous ne pouvez pas créer de fichier index à colonnes multiples utilisant le Attribut de clé PRIMARY KEY dans une colonne spécification. Ce faisant, seules les marques cette seule colonne en tant que primaire. Vous doit utiliser un fichier PRIMARY séparé Clé KEY (index_col_name, ...).

Quelque chose comme ceci peut être utilisé pour les clés primaires multi-colonnes:

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

De 13.6.4.4. Contraintes de clé étrangère

44
Adriaan Stander

La clé primaire est un concept de domaine qui identifie de manière unique (nécessairement et suffisamment) 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.

Vous souhaitez maintenant fusionner votre bibliothèque avec celle de votre voisin, tout en restant en mesure de distinguer à qui appartient un livre. Le domaine est maintenant plus large et la clé primaire est maintenant (propriétaire, book_id).

Ainsi, la composition de chaque clé primaire primaire ne devrait pas être votre stratégie, mais vous devriez plutôt l’utiliser au besoin.

Maintenant quelques faits sur MySQL. Si vous définissez une clé primaire composite et souhaitez que le RDBSM auto-incrémente les identifiants pour vous, vous devez connaître la différence entre le comportement de MyISAM et celui d'InnoDB.

Disons que nous voulons une table avec deux champs: parent_id, child_id. Et nous voulons que l'enfant_id soit auto-incrémenté.

MyISAM créera une auto-incrémentation unique dans les enregistrements portant le même parent_id et InnoDB créera une auto-incrémentation uniquement 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.

18
newtover

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 que si vous deviez modifier une large gamme de prix, toutes ces valeurs de clé primaire changeraient. Quel désordre ce serait!

0
Perry