2010-10-13 127 views
120

我想在SQL Server 2008中創建表,但我不知道如何創建複合主鍵。我怎樣才能做到這一點?如何在SQL Server 2008中創建複合主鍵

+1

正如你剛剛接觸asp.net時的一條建議:複合主鍵是一件壞事,通常表明設計思路不夠透明 – smirkingman 2010-10-13 10:12:45

+31

@smirkingman可以解決很重要的問題,複合主鍵。例如,當您有數百/數千個將行保存到單個表/實體類型的用戶時。你需要用user-id排序的行,再加上第二個值。您的價值判斷根本不正確,否則我們很快就會棄用此功能。 – 2012-07-01 06:23:54

+1

[在SQL Server中創建複合主鍵]的可能的副本(http://stackoverflow.com/questions/12594791/creating-composite-primary-key-in-sql-server) – 2016-08-03 08:14:19

回答

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

使用**主鍵之間的區別是什麼Key **和** CONSTRAINT **就像在@ matthew-abbott的例子中一樣? – mateuscb 2011-10-06 19:57:36

+24

它創建一個命名約束,可以通過名稱刪除/更新 – longhairedsi 2012-12-06 14:32:58

+3

不完全正確。兩者都創建「命名約束」。只有前者,你不能控制命名。但是,一旦創建,你可以查找使用的名稱,並刪除/更新名稱... – Auspex 2017-07-03 15:53:53

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 - 是的,命名你的約束人,否則Sql Server會做一些令人討厭的事情,如命名他們PK_UserGrou_5DEAEAF5在一個版本的DB和PK_UserGrou_3214EC0777F66C69另一個。如果你需要更新或刪除PK,這是一個痛苦,因爲你必須先從數據庫中獲取名稱,然後使用動態sql(或者先在代碼中構建命令)。而且,它很醜。 – monty 2015-10-02 00:07:19

+0

我有什麼理由不希望我的PK被聚集? – 4AM 2017-05-16 14:43:43

+0

@ 4AM這可能會回答你的問題:[鏈接](https://dba.stackexchange.com/questions/7741/when-should-a-primary-key-be-declared-non-clustered) – Dongminator 2017-06-08 22:53:45

37

通過企業管理(SSMS)...

  • 右鍵單擊表要創建的組合鍵,然後選擇設計
  • 突顯希望由列,以形成一個組合鍵
  • 右鍵點擊過這些列和設置主鍵

要看到,那麼你可以用鼠標右鍵單擊Table>Script Table As的SQL >Create To

+1

謝謝。這是最安全/最簡單的方法,不會讓我的SQL語法變得糟糕 – AlbatrossCafe 2017-04-11 21:42:11

+1

這使得那些想要通過設計/ guid界面進行快速修復的人很容易。謝謝您的幫助。 – 2017-06-28 16:03:20

1

首先創建數據庫和表,手動添加列。在哪一列作爲主鍵。您應該右鍵單擊此列並設置主鍵並設置主鍵的種子值。

-3

創建表的複合唯一鍵

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

UNIQUE鍵與PRIMARY鍵不一樣! – 2016-07-20 16:01:13

9

我知道我遲到了這個晚會,但是對於現有的表,請嘗試:

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

也添加一些說明 – 2016-10-07 22:53:10

+4

6年後,語法不正確! – 2016-12-08 05:40:51

9

對於MSSQL服務器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

我應該加上!

如果你想要改變這些外鍵/主鍵,首先你應該創建約束或者你不能做出改變。如下所示;

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

其實最後的方法是更健康和連續。你可以看看FK/PK約束名稱(dbo.dbname> Keys> ..)但是如果你不使用約束,MSSQL會自動創建隨機的FK/PK名字。您需要查看您需要的每個更改(更改表)。

我建議您爲自己設置一個標準,並且應該根據您的標準定義約束。你不必記住,你不會想太久。總之,你工作得更快。

+0

這不創造PK但只有FK,不是? – batmaci 2017-06-09 15:15:34

+0

@batmaci;不,這是FK和雙FK組對PK。這種使用更健康。我建議。當你不創建PK時,你也可以使用。 – 2017-06-17 11:58:06