416 votes

Puis-je avoir plusieurs clés primaires dans une seule table ?

Puis-je avoir plusieurs clés primaires dans une seule table ?

604voto

Adam Pierce Points 12801

Vous pouvez avoir un Clé primaire composite qui est une clé primaire composée de deux ou plusieurs colonnes. Par exemple :

CREATE TABLE userdata (
  userid integer,
  userdataid integer,
  info char(200),
  primary key (userid, userdataid)
);

Mise à jour : Voici un lien avec une description plus détaillée des clés primaires composites.

212voto

RB. Points 17993

Vous ne pouvez avoir qu'une seule clé primaire, mais vous pouvez avoir plusieurs colonnes dans votre clé primaire.

Vous pouvez également disposer d'index uniques sur votre table, qui fonctionneront un peu comme une clé primaire dans la mesure où ils imposeront des valeurs uniques et accéléreront l'interrogation de ces valeurs.

42voto

Walter Mitty Points 8726

Une table peut avoir plusieurs clés candidates. Chaque clé candidate est une colonne ou un ensemble de colonnes qui sont UNIQUES, prises ensemble, et également NOT NULL. Ainsi, il suffit de spécifier des valeurs pour toutes les colonnes d'une clé candidate pour déterminer qu'il existe une ligne qui répond aux critères, ou aucune ligne.

Les clés candidates sont un concept fondamental du modèle de données relationnel.

Il est courant, si plusieurs clés sont présentes dans une table, de désigner l'une des clés candidates comme clé primaire. Il est également courant de faire en sorte que toutes les clés étrangères de la table fassent référence à la clé primaire, plutôt qu'à toute autre clé candidate.

Je recommande ces pratiques, mais rien dans le modèle relationnel n'exige de sélectionner une clé primaire parmi les clés candidates.

16voto

Eye Points 1329

C'est la réponse à la fois à la question principale et à la question de @Kalmi de

Quel serait l'intérêt d'avoir plusieurs colonnes qui se génèrent automatiquement ?

Le code ci-dessous a une clé primaire composite. Une de ses colonnes est auto-incrémentée. Cela ne fonctionne que dans MyISAM. InnoDB générera une erreur " ERREUR 1075 (42000) : Définition de table incorrecte ; il ne peut y avoir qu'une seule colonne automatique et elle doit être définie comme une clé. ".

DROP TABLE IF EXISTS `test`.`animals`;
CREATE TABLE  `test`.`animals` (
  `grp` char(30) NOT NULL,
  `id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `name` char(30) NOT NULL,
  PRIMARY KEY (`grp`,`id`)
) ENGINE=MyISAM;

INSERT INTO animals (grp,name) VALUES
    ('mammal','dog'),('mammal','cat'),
    ('bird','penguin'),('fish','lax'),('mammal','whale'),
    ('bird','ostrich');

SELECT * FROM animals ORDER BY grp,id;

Which returns:

+--------+----+---------+
| grp    | id | name    |
+--------+----+---------+
| fish   |  1 | lax     |
| mammal |  1 | dog     |
| mammal |  2 | cat     |
| mammal |  3 | whale   |
| bird   |  1 | penguin |
| bird   |  2 | ostrich |
+--------+----+---------+

6voto

Yet Another Geek Points 2765

Comme l'ont fait remarquer les autres, il est possible d'avoir des clés primaires à plusieurs colonnes. Il faut cependant noter que si vous avez des dépendances fonctionnelles qui ne sont pas introduits par une clé, vous devez envisager de normalisation votre relation.

Exemple :

Person(id, name, email, street, zip_code, area)

Il peut y avoir une dépendance fonctionnelle entre id -> name,email, street, zip_code and area Mais souvent, un zip_code est associé à un area et donc il y a une dépendance fonctionnelle interne entre zip_code -> area .

On peut donc envisager de le scinder en une autre table :

Person(id, name, email, street, zip_code)
Area(zip_code, name)

Pour qu'il soit cohérent avec le troisième forme normale .

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