Como criar chave primária composta no SQL Server 2008

178

Quero criar tabelas no SQL Server 2008, mas não sei como criar chave primária composta. Como posso conseguir isso?

Ganesamoorthy
fonte
1
Como você é novo para asp.net, um conselho: chaves primárias compostas são uma coisa ruim que geralmente indicam um design pensada mal
smirkingman
47
@smirkingman Problemas muito importantes podem ser resolvidos, geralmente quase exclusivamente com chaves primárias compostas. Por exemplo, quando você tem centenas / milhares de usuários que salvam linhas em um único tipo de tabela / entidade. Você deseja que as linhas sejam ordenadas por ID do usuário e mais um segundo valor. Seu julgamento do valor está simplesmente incorreto; caso contrário, estaremos descontinuando esse recurso em breve.
Nicholas Petersen
2
Possível duplicado de Criação de chave primária composta no SQL Server
Arun Prasad ES

Respostas:

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
fonte
2
Qual é a diferença entre o uso de chave primária e CONSTRAINT, como no exemplo de @ matthew-abbott?
mateuscb
28
Ele cria uma restrição de chamada que podem ser excluídos / atualizados pelo nome
longhairedsi
14
Não é bem verdade. Ambos criam "restrições nomeadas". É que, com o primeiro, você não controla a nomeação. Mas, uma vez criado, você pode procurar o nome que foi usado e excluir / update pelo nome ...
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
fonte
34
+1 - Sim, nomeie as pessoas com restrições, caso contrário, o Sql Server fará coisas desagradáveis, como PK_UserGrou_5DEAEAF5 no banco de dados de uma versão e PK_UserGrou_3214EC0777F66C69 em outra. Isso é problemático se você precisar atualizar ou descartar o PK, pois é necessário primeiro obter o nome do banco de dados e usar o sql dinâmico (ou criar o comando no código primeiro). Além disso, é feio.
Monty
2
Existe alguma razão para eu não querer que meu PK seja agrupado?
04:00
1
@ 04:00 Isso pode responder à sua pergunta: link
Dongminator 8/17
52

Via Enterprise Manager (SSMS) ...

  • Clique com o botão direito do mouse na tabela em que deseja criar a chave composta e selecione Design .
  • Destaque as colunas que você deseja formar como uma chave composta
  • Clique com o botão direito do mouse sobre essas colunas e em Definir chave primária

Para ver o SQL você pode em seguida, clique direito sobre o Table> Script Table As>Create To

kevchadders
fonte
2
Obrigado. Este é o caminho mais seguro / mais fácil sem potencialmente atrapalhando meu sintaxe SQL
AlbatrossCafe
1
Isso facilita para quem deseja a solução rápida através da interface design / guid. Obrigado pela ajuda.
Trevor Nestman
32

Eu sei que estou atrasado para esta festa, mas para uma tabela existente, tente:

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

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

ATUALIZAR

Eu devo adicionar!

Se você deseja adicionar chaves estrangeiras / primárias, primeiro crie as chaves com restrições ou não poderá fazer alterações. Assim abaixo:

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

Na verdade, o último caminho é mais saudável e serial. Você pode procurar os nomes das restrições FK / PK (dbo.dbname> Chaves> ..) mas se você não usar uma restrição, o MSSQL cria automaticamente nomes aleatórios de FK / PK. Você precisará observar todas as alterações (alterar tabela) necessárias.

Eu recomendo que você defina um padrão para si mesmo; a restrição deve ser definida de acordo com o seu padrão. Você não precisará memorizar e nem pensar muito. Em resumo, você trabalha mais rápido.

Fatih Mert Doğancan
fonte
isso não cria PK, mas apenas FK, não?
batmaci
@batmaci; Não, é FK e duplo grupo FK para PK. Esse uso é mais saudável. Eu aconselho. Quando você não cria PK, também pode usar.
Fatih Mert Doğancan
1

Primeiro, crie o banco de dados e a tabela, adicionando manualmente as colunas. Em qual coluna será a chave primária. Você deve clicar com o botão direito nessa coluna e definir a chave primária e definir o valor inicial da chave primária.

Sakthi Thanuskodi
fonte
-3

Para criar uma chave exclusiva composta na tabela

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

 PRIMARY KEY ([User_Id], [Group_Id])
)
FahadHussain
fonte
2
adicione também uma descrição
Abdulla Nilam 07/10