如何在SQL Server 2008中创建复合主键

Gan*_*thy 161 sql sql-server-2008

我想在SQL Server 2008中创建表,但我不知道如何创建复合主键.我怎样才能做到这一点?

Thi*_*ilo 229

create table my_table (
     column_a integer not null,
     column_b integer not null,
     column_c varchar(50),
     primary key (column_a, column_b)
);
Run Code Online (Sandbox Code Playgroud)

  • 它创建一个可以按名称删除/更新的命名约束 (26认同)
  • 不完全正确.两者都创建"命名约束".只有前者,你才能控制命名.但是一旦创建,您可以查找使用的名称并按名称删除/更新... (11认同)
  • 像@ matthew-abbott的示例一样,使用** Primary Key **和** CONSTRAINT **之间有什么区别? (2认同)

Mat*_*ott 165

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

  CONSTRAINT PK_UserGroup PRIMARY KEY NONCLUSTERED ([User_Id], [Group_Id])
)
Run Code Online (Sandbox Code Playgroud)

  • +1 - 是的,为你的约束人命名,否则Sql Server会在一个版本的DB中将PK_UserGrou_5DEAEAF5命名为PK_UserGrou_5DEAEAF5,而在另一个版本的DB中命名为PK_UserGrou_3214EC0777F66C69.如果您需要更新或删除PK,这是一个痛苦,因为您必须首先从数据库中获取名称,然后使用动态sql(或首先在代码中构建命令).而且,它很难看. (32认同)
  • 有什么理由我不希望我的PK集群吗? (2认同)

kev*_*ers 48

通过企业管理器(SSMS)......

  • 右键单击要创建复合键的表,然后选择" 设计".
  • 突出显示要作为复合键形成的列
  • 右键单击这些列并设置主键

看到那么你可以右键点击该SQL Table> Script Table As>Create To

  • 谢谢.这是最安全/最简单的方法,不会弄乱我的SQL语法 (2认同)

Ray*_* K. 28

我知道我参加这个派对已经迟到了,但对于现有的桌子,请尝试:

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


Fat*_*can 23

对于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)
)
Run Code Online (Sandbox Code Playgroud)

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)
)
Run Code Online (Sandbox Code Playgroud)

实际上,最后一种方式更健康,更连续.您可以查看FK/PK约束名称(dbo.dbname> Keys> ..)但是如果不使用约束,MSSQL会自动创建随机FK/PK名称.您需要查看所需的每个更改(更改表).

我建议您为自己设置一个标准,并且应该根据您的标准定义约束.你不必记住,你不必考虑太久.简而言之,你工作得更快.