126 votes

Pourquoi utiliser plusieurs colonnes comme clés primaires (clé primaire composite)

Cet exemple est tiré de w3schools.

 CREATE TABLE Persons
(
    P_Id int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)
 

D'après ce que je comprends, les deux colonnes ensemble ( P_Id, LastName ) représentent une clé primaire pour la table Personnes. Est-ce correct?

  • Pourquoi quelqu'un voudrait-il utiliser plusieurs colonnes comme clés primaires au lieu d'une seule colonne?
  • Combien de colonnes peuvent être utilisées ensemble en tant que clé primaire dans une table donnée?

133voto

MJB Points 5105

Votre compréhension est correcte.

Vous devez faire cela dans de nombreux cas. Un exemple est dans une relation comme OrderHeader et OrderDetail. Le PK dans OrderHeader pourrait être OrderNumber. Le PK dans OrderDetail pourrait être OrderNumber ET LineNumber. Si c'était l'une de ces deux, il ne serait pas unique, mais la combinaison des deux est garanti unique.

L'alternative est d'utiliser un générés (non intelligent) clé primaire, par exemple, dans ce cas OrderDetailId. Mais alors vous ne serait pas toujours à voir la relation aussi facilement. Certaines personnes préfèrent d'une manière; certains préfèrent l'autre sens.

30voto

John Hartsock Points 36565

Un autre exemple de clé primaire composée est l'utilisation des tables d'association. Supposons que vous ayez une table de personnes contenant un ensemble de personnes et une table de groupes contenant un ensemble de groupes. Maintenant, vous voulez créer une relation plusieurs à plusieurs sur une personne et un groupe. Cela signifie que chaque personne peut appartenir à plusieurs groupes. Voici à quoi ressemblerait la structure de la table avec une clé primaire composée.

 Create Table Person(
PersonID int Not Null,
FirstName varchar(50),
LastName varchar(50),
Constraint PK_Person PRIMARY KEY (PersonID))

Create Table Group (
GroupId int Not Null,
GroupName varchar(50),
Constraint PK_Group PRIMARY KEY (GroupId))

Create Table GroupMember (
GroupId int Not Null,
PersonId int Not Null,
CONSTRAINT FK_GroupMember_Group FOREIGN KEY (GroupId) References Group(GroupId),
CONSTRAINT FK_GroupMember_Person FOREIGN KEY (PersonId) References Person(PersonId),
 

9voto

Robert Paulson Points 10792

Le W3Schools l'exemple n'est pas à dire quand vous devez utiliser composé des clés primaires, et est seulement de donner l'exemple de la syntaxe en utilisant le même exemple avec la table pour d'autres touches.

Leur choix de l'exemple est peut-être vous induire en erreur en combinant un sens clés (P_Id) et une clé naturelle (LastName). Ce drôle de choix de la clé primaire dit que les lignes suivantes sont valides selon le schéma et sont nécessaires pour identifier de manière unique un étudiant. Intuitivement, cela ne fait pas de sens.

1234     Jobs
1234     Gates

Pour en savoir plus: La grande clé primaire débat ou tout simplement Google meaningless primary keys ou même parcourir ce DONC, la question

FWIW - Mes 2 centimes, c'est pour éviter le multi-colonnes clés primaires et l'utilisation d'un unique généré champ id (clé de substitution) en tant que clé primaire et à l'ajout de (unique) des contraintes, si nécessaire.

4voto

sqlvogel Points 12567

Vous utilisez une clé composée (une clé avec plusieurs attributs) chaque fois que vous souhaitez vous assurer de l'unicité d'une combinaison de plusieurs attributs. Une clé d'attribut unique ne permettrait pas d'obtenir la même chose.

2voto

ig0774 Points 10389

Oui, ils forment tous les deux la clé primaire. Surtout dans les tables où vous n'avez pas de clé de substitution , il peut être nécessaire de spécifier plusieurs attributs comme identifiant unique pour chaque enregistrement (mauvais exemple: une table avec à la fois un prénom et un nom de famille peut nécessiter la combinaison de ceux-ci. unique).

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