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?


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

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

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

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


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

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.


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.


-3

Para criar uma chave exclusiva composta na tabela

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

-3
CREATE TABLE UserGroup
(
  [User_Id] INT Foreign Key,
  [Group_Id] INT foreign key,

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

2
adicione também uma descrição
Abdulla Nilam 07/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.