197 votes

Comment créer une clé primaire composite dans SQL Server 2008

Je veux créer des tables dans SQL Server 2008, mais je ne sais pas comment créer une clé primaire composite. Comment puis-je y parvenir ?

1 votes

Comme vous êtes nouveau sur asp.net, un conseil : Les clés primaires composites sont un mauvaise chose qui indiquent généralement une conception mal pensée

56 votes

@smirkingman Des problèmes très importants peuvent être résolus, souvent presque exclusivement avec des clés primaires composites. Par exemple, lorsque vous avez des centaines/milliers d'utilisateurs qui enregistrent des lignes dans une seule table/un seul type d'entité. Vous voulez que les lignes soient ordonnées par user-id, plus une deuxième valeur. Votre jugement de valeur est tout simplement incorrect, sinon, nous aurions bientôt déprécié cette fonctionnalité.

2 votes

264voto

Thilo Points 108673
create table my_table (
     column_a integer not null,
     column_b integer not null,
     column_c varchar(50),
     primary key (column_a, column_b)
);

2 votes

Quelle est la différence entre utiliser Clé primaire y CONSTRAINT comme dans l'exemple de @matthew-abbott ?

30 votes

Il crée une contrainte nommée qui peut être supprimée/mise à jour par son nom.

15 votes

Ce n'est pas tout à fait vrai. Les deux créent des "contraintes nommées". C'est juste qu'avec la première, vous ne contrôlez pas la dénomination. Mais une fois créée, vous pouvez rechercher le nom qui a été utilisé et supprimer/mettre à jour par nom...

187voto

Matthew Abbott Points 32861
CREATE TABLE UserGroup
(
  [User_Id] INT NOT NULL,
  [Group_Id] INT NOT NULL

  CONSTRAINT PK_UserGroup PRIMARY KEY NONCLUSTERED ([User_Id], [Group_Id])
)

40 votes

+1 - Oui, nommez vos contraintes, sinon Sql Server fait des choses désagréables comme les nommer PK_UserGrou_5DEAEAF5 dans la BD d'une version et PK_UserGrou_3214EC0777F66C69 dans une autre. C'est un problème si vous avez besoin de mettre à jour ou de supprimer le PK car vous devez d'abord obtenir le nom de la base de données et ensuite utiliser le sql dynamique (ou construire la commande en code d'abord). En outre, c'est laid.

2 votes

Y a-t-il une raison pour laquelle je ne voudrais pas que mon PK soit groupé ?

1 votes

@4AM Ceci peut répondre à votre question : lien

57voto

kevchadders Points 5819

Via Enterprise Manager (SSMS)...

  • Cliquez à droite sur le tableau sur lequel vous souhaitez créer la clé composite et sélectionnez Design .

  • Mettez en surbrillance les colonnes que vous souhaitez former comme une clé composite.

  • Cliquez avec le bouton droit de la souris sur ces colonnes et Définir la clé primaire

Pour voir le SQL, vous pouvez ensuite cliquer avec le bouton droit de la souris sur l'écran de l'ordinateur. Table > Script Table As > Create To

2 votes

Merci. C'est la façon la plus sûre et la plus simple de procéder sans risquer d'abîmer ma syntaxe SQL.

1 votes

Cela facilite la tâche de ceux qui veulent une solution rapide grâce à l'interface design/guide. Merci pour votre aide.

37voto

Ray K. Points 361

Je sais que je suis en retard pour cette fête, mais pour une table existante, essayez :

ALTER table TABLE_NAME
ADD CONSTRAINT [name of your PK, e.g. PK_TableName] PRIMARY KEY CLUSTERED (column1, column2, etc.)

32voto

Pour MSSQL Server 2012

CREATE TABLE usrgroup(
  usr_id int FOREIGN KEY REFERENCES users(id),
  grp_id int FOREIGN KEY REFERENCES groups(id),

  PRIMARY KEY (usr_id, grp_id)
)

UPDATE

Je devrais ajouter !

Si vous voulez modifier des clés étrangères / primaires, vous devez d'abord créer les clés avec des contraintes, sinon vous ne pourrez pas faire de modifications. Comme ceci ci-dessous :

CREATE TABLE usrgroup(
  usr_id int,
  grp_id int,

  CONSTRAINT FK_usrgroup_usrid FOREIGN KEY (usr_id) REFERENCES users(id),
  CONSTRAINT FK_usrgroup_groupid FOREIGN KEY (grp_id) REFERENCES groups(id),

  CONSTRAINT PK_usrgroup PRIMARY KEY (usr_id,grp_id)
)

En fait, la dernière façon est plus saine et plus sérielle. Vous pouvez regarder les noms des contraintes FK/PK. (dbo.dbname > Keys > ..) mais si vous n'utilisez pas de contrainte, MSSQL crée automatiquement des noms de FK/PK aléatoires. Vous devrez examiner chaque modification (alter table) dont vous avez besoin.

Je vous recommande de vous fixer une norme ; la contrainte doit être définie en fonction de cette norme. Vous n'aurez pas à mémoriser et vous ne devrez pas réfléchir trop longtemps. En bref, vous travaillez plus vite.

0 votes

Cela ne crée pas de PK mais seulement des FK, non ?

0 votes

@batmaci ; Non, c'est à la fois le groupe FK et le groupe double FK à PK. Cette utilisation est plus saine. Je le conseille. Si vous ne créez pas de PK, vous pouvez aussi l'utiliser.

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