2010-10-13 7 views
120

Ich möchte Tabellen in SQL Server 2008 erstellen, aber ich weiß nicht, wie Sie einen zusammengesetzten Primärschlüssel erstellen. Wie kann ich das erreichen?Erstellen eines zusammengesetzten Primärschlüssels in SQL Server 2008

+1

Wie Sie neu auf asp.net sind, ein Ratschlag: Composite Primärschlüssel sind eine * schlechte Sache *, die normalerweise ein schlecht durchdachtes Design anzeigen – smirkingman

+31

@smirkingman Sehr wichtige Probleme können oft fast ausschließlich mit gelöst werden zusammengesetzte Primärschlüssel. Zum Beispiel, wenn Sie Hunderte/Tausende von Benutzern haben, die Zeilen in einem einzelnen Tabellen-/Entitätstyp speichern. Sie möchten die Zeilen sortiert nach Benutzer-ID, plus einen zweiten Wert. Ihr Werturteil ist einfach falsch, wenn nicht, würden wir dieses Feature bald ablehnen. –

+1

Mögliches Duplikat von [Erstellen eines zusammengesetzten Primärschlüssels in SQL Server] (http://stackoverflow.com/questions/12594791/creating-composite-primary-key-in-sql-server) –

Antwort

185
create table my_table (
    column_a integer not null, 
    column_b integer not null, 
    column_c varchar(50), 
    primary key (column_a, column_b) 
); 
+1

Was ist der Unterschied zwischen der Verwendung von ** Primary Key ** und ** CONSTRAINT ** wie im Beispiel von @ matthew-abbott? – mateuscb

+24

Es erstellt eine benannte Einschränkung, die durch den Namen gelöscht/aktualisiert werden kann – longhairedsi

+3

Nicht ganz richtig. Beide erstellen "benannte Einschränkungen". Es ist nur so, dass bei ersterem die Benennung nicht kontrolliert wird. Aber einmal erstellt, können Sie den Namen suchen, der verwendet wurde und löschen/aktualisieren nach Name ... – Auspex

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

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

+1 - Ja, nennen Sie Ihre Einschränkungen Menschen, sonst Sql Server macht böse Dinge wie sie PK_UserGrou_5DEEAAF5 in einem Release DB und PK_UserGrou_3214EC0777F66C69 auf Ein weiterer. Dies ist ein Problem, wenn Sie den PK aktualisieren oder löschen müssen, da Sie zuerst den Namen aus der Datenbank holen und dann dynamic sql verwenden müssen (oder den Befehl zuerst im Code erstellen). Außerdem ist es hässlich. – monty

+0

Gibt es einen Grund, warum ich nicht möchte, dass mein PK geclustert wird? – 4AM

+0

@ 4AM Dies kann Ihre Frage beantworten: [link] (https://dba.stackexchange.com/questions/7741/when-should-a-primary-key-be-declared-non-clustered) – Dongminator

37

Via Enterprise Manager (SSMS) ...

  • Direkt an der Tabelle Klicken Sie wünschen Ihnen auf den zusammengesetzten Schlüssel zu erstellen und wählen Sie Entwurf.
  • Markieren Sie die Spalten wünschen Ihnen als Verbund Schlüssel
  • Rechts zu bilden, die Spalten Klicken Sie auf und Set Primary Key

die SQL Um zu sehen, können Sie dann direkt auf die Table>Script Table As klicken >Create To

+1

Vielen Dank. Dies ist der sicherste/einfachste Weg, ohne meine SQL-Syntax zu beschädigen. – AlbatrossCafe

+1

Dies macht es für diejenigen, die die schnelle Lösung über die Design/GUID-Schnittstelle wollen. Danke für die Hilfe. –

1

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

-3

Um einen Verbund eindeutigen Schlüssel auf dem Tisch

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

Ein EINZIGARTIGER Schlüssel ist nicht dasselbe wie ein PRIMÄR Schlüssel !!! –

9

erstelle ich weiß, ich bin spät zu dieser Partei, sondern für eine vorhandene Tabelle, versuchen:

ALTER table TABLE_NAME 
ADD CONSTRAINT [name of your PK, e.g. PK_TableName] PRIMARY KEY CLUSTERED (column1, column2, etc.) 
-1
CREATE TABLE UserGroup 
(
    [User_Id] INT Foreign Key, 
    [Group_Id] INT foreign key, 

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

fügen Sie auch eine Beschreibung hinzu –

+4

6 Jahre zu spät und Syntax nicht korrekt! –

9

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

UPDATE

Ich sollte hinzufügen!

Wenn Sie möchten, dass diese Fremd-/Primärschlüssel sich ändern, sollten Sie zuerst mit Einschränkungen erstellt werden oder Sie können keine Änderungen vornehmen. So wie unten;

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 seriell. Sie können die FK/PK Constraint-Namen (dbo.dbname> Keys> ..) aussehen, aber wenn Sie nicht Constraint verwenden, erstellen MSSQL automatisch Random FK/PK-Namen. Sie müssen jede Änderung (alter Tabelle) betrachten, die Sie benötigen.

Ich empfehle, dass Sie einen Standard für sich selbst festlegen und die Einschränkung sollte nach Ihrem Standard definiert werden. Sie müssen sich nicht merken und Sie müssen nicht zu lange nachdenken. Kurz gesagt, Sie arbeiten schneller.

+0

das erstellt nicht PK, sondern nur FK, nicht? – batmaci

+0

@batmaci; Nein, es ist FK und FK-Gruppe zu PK. Dieser Gebrauch ist gesünder. Ich rate es. Wenn Sie PK nicht erstellen, können Sie auch verwenden. –

Verwandte Themen