2010-10-13 15 views
120

Chcę utworzyć tabele w programie SQL Server 2008, ale nie wiem, jak utworzyć złożony klucz podstawowy. Jak mogę to osiągnąć?Jak utworzyć złożony klucz podstawowy w SQL Server 2008

+1

Gdy jesteś nowicjuszem w asp.net, porada: Klucze podstawowe złożone są * złe rzeczy *, które zwykle oznaczają źle przemyślany projekt – smirkingman

+31

@smirkingman Bardzo ważne problemy mogą być rozwiązane, często prawie wyłącznie z złożone klucze podstawowe. Tak jak wtedy, gdy masz setki/tysiące użytkowników, którzy zapisują wiersze do jednego typu tabeli/jednostki. Chcesz wiersze uporządkowane według identyfikatora użytkownika, a następnie drugą wartość. Twoja ocena wartości jest po prostu niepoprawna, jeśli nie, wkrótce wycofalibyśmy tę funkcję. –

+1

Możliwy duplikat [Tworzenie złożonego klucza podstawowego w SQL Server] (http://stackoverflow.com/questions/12594791/creating-composite-primary-key-in-sql-server) –

Odpowiedz

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

Jaka jest różnica między używaniem ** Podstawowy Klucz ** i ** CONSTRAINT ** jak w przykładzie @ matthew-abbott? – mateuscb

+24

Tworzy to nazwane ograniczenie, które można usunąć/zaktualizować o nazwę – longhairedsi

+3

Nie do końca. Oba tworzą "nazwane więzy". Po prostu z tym pierwszym nie kontrolujesz nazewnictwa. Ale raz utworzone, możesz wyszukać nazwę, która była używana i usunąć/zaktualizować nazwę ... – 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 - Tak, nazwij swoje ograniczenia ludziom, inaczej Serwer Sql robi nieprzyjemne rzeczy, nazywaj je PK_UserGrou_5DEAEAF5 w DB jednego wydania i PK_UserGrou_3214EC0777F66C69 na inne. To jest problem, jeśli musisz zaktualizować lub upuścić PK, ponieważ najpierw musisz pobrać nazwę z bazy danych, a następnie użyć dynamicznego sql (lub najpierw zbudować polecenie w kodzie). Poza tym jest brzydka. – monty

+0

Czy jest jakikolwiek powód, dla którego nie chciałbym, aby mój PK był skupiony? – 4AM

+0

@ 4AM Może to odpowiedzieć na twoje pytanie: [link] (https://dba.stackexchange.com/questions/7741/when-should-a-primary-key-be-declared-non-clustered) – Dongminator

37

Via Enterprise Manager (SSMS) ...

  • prawym przyciskiem myszy na tabeli chcesz utworzyć klucz kompozytowe i wybierz projekt.
  • Highlight kolumny chcesz utworzyć jako złożonego klucza
  • Prawy klik na te kolumny i Set Primary Key

Aby zobaczyć SQL można następnie prawym przyciskiem myszy na Table>Script Table As >Create To

+1

Dziękuję. Jest to najbezpieczniejszy/najłatwiejszy sposób bez potencjalnego zepsucia mojej składni SQL – AlbatrossCafe

+1

Ułatwia to tych, którzy chcą szybkiej naprawy poprzez interfejs design/guid. Dzięki za pomoc. –

1

Najpierw utwórz bazę danych i tabelę, ręcznie dodając kolumny. W której kolumnie ma być klucz podstawowy. Powinieneś kliknąć prawym przyciskiem myszy tę kolumnę i ustawić klucz podstawowy i ustawić wartość początkową klucza podstawowego.

-3

Aby utworzyć kompozytowy unikalny klucz na stole

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

Klucz UNIQUE NIE jest taki sam, jak klucz PRIMARY !!! –

9

wiem, jestem spóźniona do tej partii, ale dla istniejącej tabeli, spróbuj:

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

dodaj opis zbyt –

+4

6 lat późno i składnia nie jest poprawna! –

9

Dla 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

Powinienem dodać!

Jeśli chcesz zmienić te klucze obce/podstawowe, najpierw powinieneś utworzyć z ograniczeniem lub nie możesz wprowadzać zmian. Tak jak to poniżej;

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

Właściwie ostatni sposób jest zdrowszy i seryjny. Możesz sprawdzić nazwy ograniczeń FK/PK (dbo.dbname> Keys> ..), ale jeśli nie używasz ograniczenia, MSSQL automatycznie tworzy losowe nazwy FK/PK. Będziesz musiał spojrzeć na każdą zmianę (alter table), której potrzebujesz.

Zalecam, aby ustawić dla siebie standard, a ograniczenie powinno być zdefiniowane zgodnie ze swoim standardem. Nie będziesz musiał zapamiętywać i nie będziesz musiał myśleć zbyt długo. Krótko mówiąc, pracujesz szybciej.

+0

to nie tworzy PK ale tylko FK, nie? – batmaci

+0

@batmaci; Nie, to zarówno FK, jak i podwójna grupa FK do PK. To użycie jest zdrowsze. Radzę. Jeśli nie tworzysz PK, możesz również użyć. –

Powiązane problemy