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


178

Je souhaite créer des tables dans SQL Server 2008, mais je ne sais pas comment créer une clé primaire composite. Comment puis-je atteindre cet objectif?


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

47
@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 un seul type de table / entité. Vous voulez que les lignes soient triées par ID utilisateur, plus une seconde valeur. Votre jugement de valeur est tout simplement incorrect, sinon, nous abandonnerions cette fonctionnalité sous peu.
Nicholas Petersen

Réponses:


243
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
Quelle est la différence entre l'utilisation de la clé primaire et de CONSTRAINT comme dans l'exemple de @ matthew-abbott?
mateuscb

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

14
Pas tout à fait vrai. Les deux créent des «contraintes nommées». C'est juste qu'avec le premier, vous ne contrôlez pas la dénomination. Mais une fois créé, vous pouvez rechercher le nom qui a été utilisé et supprimer / mettre à jour par nom ...
Auspex

170
CREATE TABLE UserGroup
(
  [User_Id] INT NOT NULL,
  [Group_Id] INT NOT NULL

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

34
+1 - Oui, nommez vos contraintes personnes, sinon Sql Server fait des choses désagréables comme les nomme PK_UserGrou_5DEAEAF5 dans la DB d'une version et PK_UserGrou_3214EC0777F66C69 dans une autre. C'est pénible si vous devez mettre à jour ou supprimer le PK car vous devez d'abord obtenir le nom de la base de données, puis utiliser SQL dynamique (ou créer d'abord la commande dans le code). De plus, c'est moche.
monty

2
Y a-t-il une raison pour laquelle je ne voudrais pas que mon PK soit mis en cluster?
4h

1
@ 4AM Cela peut répondre à votre question: lien
Dongminator

52

Via Enterprise Manager (SSMS) ...

  • Cliquez avec le bouton droit sur la table sur laquelle vous souhaitez créer la clé composite et sélectionnez Conception .
  • Mettez en surbrillance les colonnes que vous souhaitez former en tant que clé composite
  • Faites un clic droit sur ces colonnes et définissez la clé primaire

Pour voir le SQL vous pouvez cliquer droit sur le Table> Script Table As>Create To


2
Je vous remercie. C'est le moyen le plus sûr / le plus simple sans potentiellement gâcher ma syntaxe SQL
AlbatrossCafe

1
Cela facilite la tâche à ceux qui veulent une solution rapide via l'interface de conception / guid. Merci pour l'aide.
Trevor Nestman

32

Je sais que je suis en retard à 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.)

27

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)
)

METTRE À JOUR

Je devrais ajouter!

Si vous souhaitez ajouter des modifications de clés étrangères / primaires, vous devez d'abord créer les clés avec des contraintes ou vous ne pouvez pas apporter 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, le dernier moyen est plus sain et en série. Vous pouvez rechercher les noms des contraintes FK / PK (dbo.dbname> Keys> ..) mais si vous n'utilisez pas de contrainte, MSSQL crée automatiquement des noms FK / PK aléatoires. Vous devrez examiner chaque changement (alter table) dont vous avez besoin.

Je vous recommande de vous fixer une norme; la contrainte doit être définie selon votre standard. Vous n'aurez pas à mémoriser et vous n'aurez pas à réfléchir trop longtemps. Bref, vous travaillez plus vite.


cela ne crée pas PK mais seulement FK, non?
batmaci

@batmaci; Non, c'est à la fois FK et double groupe FK à PK. Cette utilisation est plus saine. Je le conseille. Lorsque vous ne créez pas PK, vous pouvez également utiliser.
Fatih Mert Doğancan

1

Créez d'abord la base de données et la table, en ajoutant manuellement les colonnes. Dans quelle colonne doit être la clé primaire. Vous devez cliquer avec le bouton droit de la souris sur cette colonne, définir la clé primaire et définir la valeur de départ de la clé primaire.


-3

Pour créer une clé unique composite sur la table

ALTER TABLE [TableName] ADD UNIQUE ([Column1], [Column2], [column3]);

-3
CREATE TABLE UserGroup
(
  [User_Id] INT Foreign Key,
  [Group_Id] INT foreign key,

 PRIMARY KEY ([User_Id], [Group_Id])
)

2
ajouter une description aussi
Abdulla Nilam
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.