web-dev-qa-db-fra.com

Clé primaire et clé étrangère en même temps

Serait-il possible dans SQL Server 2008 d'avoir une table créée avec 2 colonnes qui sont à la fois des clés primaires et étrangères? Si oui, à quoi ressemblerait un tel code? J'ai cherché et je n'ai rien trouvé.

38
Eduard Luca

Bien sûr pas de problème:

CREATE TABLE dbo.[User]
(
  Id int NOT NULL IDENTITY PRIMARY KEY,
  Name nvarchar(1024) NOT NULL
);

CREATE TABLE [Group] 
(
  Id int NOT NULL IDENTITY PRIMARY KEY,
  Name nvarchar(1024) NOT NULL
);

CREATE TABLE [UserToGroup]
(
  UserId int NOT NULL,
  GroupId int NOT NULL,
  PRIMARY KEY CLUSTERED ( UserId, GroupId ),
  FOREIGN KEY ( UserId ) REFERENCES [User] ( Id ) ON UPDATE  NO ACTION  ON DELETE  CASCADE,
  FOREIGN KEY ( GroupId ) REFERENCES [Group] ( Id ) ON UPDATE  NO ACTION  ON DELETE  CASCADE
);

Ceci est assez couramment utilisé pour modéliser des relations plusieurs-à-plusieurs.

54
Marnix van Valen

Ce sont des constructions totalement différentes.

Un clé primaire est utilisé pour imposer l'unicité dans une table et être un identifiant unique pour un certain enregistrement.

Un Foreign Key est utilisé pour l'intégrité référentielle, pour s'assurer qu'une valeur existe dans une autre table.

La clé étrangère doit référencer la clé primaire dans une autre table.

Si vous souhaitez avoir une clé étrangère également unique, vous pouvez créer une contrainte FK et ajouter un index/contrainte unique à ce même champ.

À des fins de référence, SQL Server permet à un FK de faire référence à un UNIQUE CONSTRAINT ainsi qu'à un PRIMARY KEY champ.

8
JNK

Ce n'est probablement pas une bonne idée car souvent vous voulez autoriser les clés étrangères en double dans la table. Même si vous ne le faites pas maintenant, à l'avenir, vous pourriez, alors mieux vaut ne pas le faire. Voir Est-ce bien d'avoir une clé étrangère comme clé primaire?

3
thebiggestlebowski

Juste une petite note - à partir des pages Microsoft ( http://msdn.Microsoft.com/en-us/library/ms189049.aspx ) ...

"Une contrainte de clé étrangère ne doit pas être liée uniquement à une contrainte de clé primaire dans une autre table; elle peut également être définie pour référencer les colonnes d'une contrainte UNIQUE dans une autre table."

Peu utilisé, mais utile dans certaines circonstances.

1
KeithFearnley