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, comment un tel code? J'ai cherché et est venu avec rien.
4 réponses
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
);
c'est assez couramment utilisé pour modéliser les relations de plusieurs à plusieurs.
ce sont des constructions totalement différentes.
Un Clé Primaire est utilisé pour renforcer l'unicité au sein d'une table, et d'un identifiant unique pour un enregistrement précis.
Un Clé Étrangère est utilisé pour l'intégrité référentielle, afin de s'assurer qu'une valeur existe dans une autre table.
la clé étrangère doit renvoyer à la clé primaire dans un autre tableau.
si vous vous voulez avoir une clé étrangère qui est aussi unique, vous pouvez faire une contrainte FK et Ajouter un index/contrainte unique à ce même champ.
à titre de référence, SQL Server permet à un FK de faire référence à un champ UNIQUE CONSTRAINT
ainsi qu'à un champ PRIMARY KEY
.
ce n'est probablement pas une bonne idée car souvent vous voulez permettre de dupliquer des clés étrangères dans la table. Même si tu ne le fais pas maintenant, dans le futur, tu pourrais, donc mieux ne pas le faire. Voir c'Est bien d'avoir de clé étrangère en tant que clé primaire?
juste une note rapide - de Microsoft pages ( http://msdn.microsoft.com/en-us/library/ms189049.aspx )...
" une contrainte de clé étrangère ne doit pas nécessairement être liée uniquement à une contrainte de clé primaire dans un autre tableau; elle peut également être définie pour renvoyer aux colonnes d'une contrainte UNIQUE dans un autre tableau."
pas utilisé souvent, mais utile dans certaines circonstances.