Come creare una chiave primaria composita in SQL Server 2008


178

Voglio creare tabelle in SQL Server 2008, ma non so come creare una chiave primaria composita. Come posso raggiungere questo obiettivo?


1
Dato che sei nuovo su asp.net, un consiglio: le chiavi primarie composite sono una cosa negativa che di solito indica un design mal concepito
smirkingman

47
@smirkingman È possibile risolvere problemi molto importanti, spesso quasi esclusivamente con chiavi primarie composite. Ad esempio quando hai centinaia / migliaia di utenti che salvano le righe in una singola tabella / tipo di entità. Vuoi le righe ordinate per id utente, più poi un secondo valore. Il tuo giudizio di valore è semplicemente errato, in caso contrario, svaluteremo presto questa funzionalità.
Nicholas Petersen,

Risposte:


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
Qual è la differenza tra l'utilizzo della chiave primaria e CONSTRAINT come nell'esempio di @ matthew-abbott?
mateuscb,

28
Crea un vincolo denominato che può essere eliminato / aggiornato per nome
longhairedsi

14
Non del tutto vero. Entrambi creano "vincoli nominati". È solo che con il primo non controlli la denominazione. Ma una volta creato, puoi cercare il nome che è stato utilizzato ed eliminare / aggiornare per nome ...
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 - Sì, dai un nome ai tuoi vincoli, altrimenti Sql Server fa cose sgradevoli come nominali PK_UserGrou_5DEAEAF5 nel DB di una versione e PK_UserGrou_3214EC0777F66C69 su un'altra. Questo è un problema se devi aggiornare o rilasciare il PK in quanto devi prima ottenere il nome dal db e quindi usare sql dinamico (o creare prima il comando nel codice). Inoltre, è brutto.
monty,

2
C'è qualche motivo per cui non vorrei che il mio PK fosse raggruppato?
4:00

1
@ 4AM Questo potrebbe rispondere alla tua domanda: link
Dongminator

52

Tramite Enterprise Manager (SSMS) ...

  • Fare clic con il tasto destro del mouse sulla tabella in cui si desidera creare la chiave composita e selezionare Design .
  • Evidenzia le colonne che desideri formare come chiave composita
  • Fare clic con il tasto destro su quelle colonne e impostare la chiave primaria

Per vedere la SQL si può quindi fare clic destro sul Table> Script Table As>Create To


2
Grazie. Questo è il modo più sicuro / semplice senza potenzialmente incasinare la mia sintassi SQL
AlbatrossCafe

1
Questo lo rende facile per coloro che desiderano la soluzione rapida tramite l'interfaccia design / guid. Grazie per l'aiuto.
Trevor Nestman,

32

So di essere in ritardo per questa festa, ma per un tavolo esistente, prova:

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

27

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

AGGIORNARE

Dovrei aggiungere!

Se si desidera aggiungere la modifica di chiavi esterne / primarie, innanzitutto è necessario creare le chiavi con vincoli o non è possibile apportare modifiche. In questo modo di seguito:

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

In realtà l'ultimo modo è più sano e seriale. Puoi guardare i nomi dei vincoli FK / PK (dbo.dbname> Keys> ..) ma se non usi un vincolo, MSSQL crea automaticamente nomi FK / PK casuali. Dovrai esaminare ogni modifica (modifica tabella) di cui hai bisogno.

Ti consiglio di stabilire uno standard per te stesso; il vincolo deve essere definito in base allo standard. Non dovrai memorizzare e non dovrai pensare troppo a lungo. In breve, lavori più velocemente.


questo non crea PK ma solo FK, no?
Batmaci,

@batmaci; No, è sia il gruppo FK che il doppio gruppo FK in PK. Quell'uso è più sano. Lo consiglio. Quando non crei PK, puoi anche usarlo.
Fatih Mert Doğancan,

1

Innanzitutto crea il database e la tabella, aggiungendo manualmente le colonne. In quale colonna deve essere la chiave primaria. È necessario fare clic con il pulsante destro del mouse su questa colonna e impostare la chiave primaria e impostare il valore seed della chiave primaria.


-3

Per creare una chiave univoca composita sulla tabella

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
aggiungi anche una descrizione
Abdulla Nilam,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.