So erstellen Sie einen zusammengesetzten Primärschlüssel in SQL Server 2008

178

Ich möchte Tabellen in SQL Server 2008 erstellen, weiß jedoch nicht, wie ein zusammengesetzter Primärschlüssel erstellt wird. Wie kann ich das erreichen?

Ganesamoorthy
quelle
1
Da Sie neu bei asp.net sind, ein Ratschlag: Zusammengesetzte Primärschlüssel sind eine schlechte Sache , die normalerweise auf ein schlecht durchdachtes Design hinweisen
Grinsender
47
@smirkingman Sehr wichtige Probleme können gelöst werden, oft fast ausschließlich mit zusammengesetzten Primärschlüsseln. Zum Beispiel, wenn Sie Hunderte / Tausende von Benutzern haben, die Zeilen in einem einzelnen Tabellen- / Entitätstyp speichern. Sie möchten die nach Benutzer-ID geordneten Zeilen plus einen zweiten Wert. Ihr Werturteil ist einfach falsch. Wenn nicht, werden wir diese Funktion bald ablehnen.
Nicholas Petersen

Antworten:

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)
);
Thilo
quelle
2
Wie ist der Unterschied zwischen der Verwendung von Primärschlüssel und CONSTRAINT im Beispiel von @ matthew-abbott?
Mateuscb
28
Es erstellt eine benannte Einschränkung, die nach Namen gelöscht / aktualisiert werden kann
longhairedsi
14
Nicht ganz richtig. Beide erstellen "benannte Einschränkungen". Es ist nur so, dass Sie mit dem ersteren die Benennung nicht kontrollieren. Aber einmal erstellt, können Sie den verwendeten Namen nachschlagen und nach Namen löschen / aktualisieren ...
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])
)
Matthew Abbott
quelle
34
+1 - Ja, nennen Sie Ihre Einschränkungen Personen, sonst macht SQL Server böse Dinge wie die Namen PK_UserGrou_5DEAEAF5 in der DB einer Version und PK_UserGrou_3214EC0777F66C69 in einer anderen. Dies ist ein Problem, wenn Sie die PK aktualisieren oder löschen müssen, da Sie zuerst den Namen von der Datenbank abrufen und dann dynamisches SQL verwenden müssen (oder den Befehl zuerst im Code erstellen müssen). Es ist auch hässlich.
Montag,
2
Gibt es einen Grund, warum ich nicht möchte, dass meine PK geclustert wird?
4
1
@ 4AM Dies kann Ihre Frage beantworten: Link
Dongminator
52

Über Enterprise Manager (SSMS) ...

  • Klicken Sie mit der rechten Maustaste auf die Tabelle, für die Sie den zusammengesetzten Schlüssel erstellen möchten, und wählen Sie Design .
  • Markieren Sie die Spalten, die Sie als zusammengesetzten Schlüssel bilden möchten
  • Klicken Sie mit der rechten Maustaste auf diese Spalten und wählen Sie Primärschlüssel festlegen

Um die SQL sehen Sie dann einen Rechtsklick auf die Table> Script Table As>Create To

Kevchadders
quelle
2
Danke dir. Dies ist der sicherste / einfachste Weg, ohne meine SQL-Syntax durcheinander zu bringen
AlbatrossCafe
1
Dies macht es einfach für diejenigen, die eine schnelle Lösung über die Design / Guid-Oberfläche wünschen. Danke für die Hilfe.
Trevor Nestman
32

Ich weiß, dass ich zu spät zu dieser Party komme, aber für einen vorhandenen Tisch versuchen Sie:

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

Für 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)
)

AKTUALISIEREN

Ich sollte hinzufügen!

Wenn Sie Fremd- / Primärschlüssel hinzufügen möchten, die sich ändern, sollten Sie zuerst die Schlüssel mit Einschränkungen erstellen, da Sie sonst keine Änderungen vornehmen können. Wie folgt:

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

Eigentlich ist der letzte Weg gesünder und serieller. Sie können die FK / PK-Einschränkungsnamen anzeigen (dbo.dbname> Keys> ..). Wenn Sie jedoch keine Einschränkung verwenden, erstellt MSSQL automatisch zufällige FK / PK-Namen. Sie müssen sich jede Änderung (Tabelle ändern) ansehen, die Sie benötigen.

Ich empfehle Ihnen, einen Standard für sich selbst zu setzen. Die Einschränkung sollte gemäß Ihrem Standard definiert werden. Sie müssen sich nicht merken und müssen nicht zu lange nachdenken. Kurz gesagt, Sie arbeiten schneller.

Fatih Mert Doğancan
quelle
Dies schafft keine PK, sondern nur FK, nicht?
Batmaci
@ Batmaci; Nein, es ist sowohl eine FK- als auch eine Doppel-FK-Gruppe für PK. Diese Verwendung ist gesünder. Ich rate es. Wenn Sie keine PK erstellen, können Sie diese auch verwenden.
Fatih Mert Doğancan
1

Erstellen Sie zuerst die Datenbank und die Tabelle und fügen Sie die Spalten manuell hinzu. In welcher Spalte Primärschlüssel sein soll. Sie sollten mit der rechten Maustaste auf diese Spalte klicken, den Primärschlüssel festlegen und den Startwert des Primärschlüssels festlegen.

Sakthi Thanuskodi
quelle
-3

So erstellen Sie einen zusammengesetzten eindeutigen Schlüssel für die Tabelle

ALTER TABLE [TableName] ADD UNIQUE ([Column1], [Column2], [column3]);
Abhishek Jaiswal
quelle
-3
CREATE TABLE UserGroup
(
  [User_Id] INT Foreign Key,
  [Group_Id] INT foreign key,

 PRIMARY KEY ([User_Id], [Group_Id])
)
FahadHussain
quelle
2
Fügen Sie auch eine Beschreibung hinzu
Abdulla Nilam