Chave primária de incremento automático no SQL Server Management Studio 2012


446

Como eu auto incremento primary keyem uma SQL Servertabela de banco de dados, eu tive um olhar através do fórum, mas não pode ver como.

Procurei nas propriedades, mas não consigo ver uma opção. Vi uma resposta em que você acessa a Identitypropriedade de especificação, define-a como sim e define-a Identity incrementcomo 1, mas essa seção fica acinzentada e não posso alterar o não ao sim.

Deve haver uma maneira simples de fazer isso, mas não consigo encontrá-lo.


5
O tipo de dados da coluna-chave é int?
Raab

1
@Code viciado em seu conjunto currenty como char (10), mas eu posso mudá-lo como eu estou apenas praticando, graças
Ledgemonkey

Respostas:


703

Verifique se o tipo de dados da coluna Key é inte, em seguida, defina a identidade manualmente, como mostra a imagem

insira a descrição da imagem aqui

Ou apenas execute este código

-- ID is the name of the  [to be] identity column
ALTER TABLE [yourTable] DROP COLUMN ID 
ALTER TABLE [yourTable] ADD ID INT IDENTITY(1,1)

o código será executado, se IDnão for a única coluna na tabela

referência de imagem fifo's


21
Basta um pouco de correção: A IDENTITYpropriedade pode ser aplicada a qualquer tipo de dados numéricos (assim que poderia ser tinyint, smallint, int, bigint, numeric, decimal), a única restrição é que ele não poderia representar número fracionário (por isso não pode ser float , ou real, nem numericou decimal com escala diferente de zero ) e ofc, a especificação de identidade deve ser compatível com o tipo de dados selecionado.
Pred

2
Trabalho, contanto que não haja chaves estrangeiras etc.
Andrew Day

3
Eu só queria adicionar, se você já definiu um valor padrão na sua coluna de identidade, o (Is Identity) permanece acinzentado. Remova o valor padrão e ele se torna disponível novamente.
CDSpace

7
Se você não pode modificar os valores, vá para Ferramentas-Opções-Designers e desmarque a opção "impedir salvar alterações que exijam recriação".
Jaume

184

Ao criar a tabela, você pode criar uma IDENTITYcoluna da seguinte maneira:

CREATE TABLE (
  ID_column INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  ...
);

A IDENTITYpropriedade incrementará automaticamente a coluna a partir do número 1. (Observe que o tipo de dados da coluna precisa ser um número inteiro.) Se você deseja adicionar isso a uma coluna existente, use um ALTER TABLEcomando.

Edit:
Testado um pouco, e não consigo encontrar uma maneira de alterar as propriedades de identidade através da janela Propriedades da coluna para várias tabelas. Eu acho que se você quiser transformar uma coluna em uma coluna de identidade, é necessário usar um ALTER TABLEcomando.


Ah, isso é especificamente para o SQL Server 2008 r2 - não importa.
Josien

2
esta sintaxe de criação de tabela é uma boa prática, conforme recomendado pelo autor deste post nos comentários, a esperança ajuda alguém.
Shaijut 1/11

88

Você precisa expandir a seção Identidade para expor incremento e semente.

insira a descrição da imagem aqui

Edit: Eu assumi que você teria um tipo de dados inteiro, não char (10). O que é razoável, eu diria e válido quando publiquei esta resposta


2
O yesé acinzentado, pois é char(10)(de comentário só postou)
Martin Smith

@ Martin Smith sim que parece ser a questão geral, eu vou mudar isso e teste, muito obrigado
Ledgemonkey

ao criar uma nova tabela que usei BookID int primary key identity, não especifiquei a semente e o incremento, isso é uma boa prática? causa eu vejo a documentação no MSDN Se nenhum for especificado, o padrão é (1,1).
shaijut

40

Expanda seu banco de dados, expanda sua tabela, clique com o botão direito na sua tabela e selecione o design no menu suspenso. Se parece com isso

Agora vá propriedades da coluna abaixo dele role para baixo e encontrar Identidade Specification , expandi-lo e você vai encontrar é a identidade torná-lo Sim. Agora escolha Incremento de identidade logo abaixo e forneça o valor que você deseja incrementar. insira a descrição da imagem aqui


1
parece que seria a resposta correta para mim, apenas tornar o tipo de dados int não funcionaria, certo?
Drewdin

10

Talvez esteja faltando alguma coisa, mas por que isso não funciona com o objeto SEQUENCE? Não é isso que você está procurando?

Exemplo:

CREATE SCHEMA blah.
GO

CREATE SEQUENCE blah.blahsequence
START WITH 1
INCREMENT BY 1
NO CYCLE;

CREATE TABLE blah.de_blah_blah
(numbers bigint PRIMARY KEY NOT NULL
......etc

Ao referenciar o squence em um comando INSERT, basta usar:

NEXT VALUE FOR blah.blahsequence

Mais informações e opções para SEQUENCE


Esta solução é a correta se você se preocupa com a ordem do tempo das linhas inseridas, porque IDENTITYàs vezes salta deixando lacunas, então volta a preencher essas lacunas novamente. Portanto IDENTITY, não garante SEMPRE a condição
incremental

1
@ Martin Smith Opa, não segui o link, meu erro! Eu me acostumei ao MS-SQL por não ter certos recursos que às vezes esqueço que existem versões mais novas que suportam mais coisas. Excluirei meu comentário, pois pode ser confuso ... Se expresso de maneira mais geral, permanece válido: pode ser que ele esteja usando uma versão / make RDBMS que não suporta objetos SEQUENCE - especialmente porque a pergunta foi feita apenas alguns meses após o SQL Server 2012 foi lançado;)
Paul Groke

1
@FindOut_Quran Tem certeza de que as lacunas nas colunas IDENTITY estão preenchidas? Eu só trabalhei com o SQL Server 2005 onde nunca vi isso acontecer - as lacunas simplesmente permanecem. E ficaria surpreso ao ver isso acontecer em qualquer RDBMS, porque esse recurso seria uma combinação estranha de "não livre" (em termos de desempenho) e "não desejável" (pelo menos na maioria dos aplicativos).
Paul Groke

@PaulGroke Sim, tenho certeza. Você pode tentar usar uma transação para inserir 1000 linhas e depois reverter. O valor da identidade aumentará. Tente inserir mais milhares de linhas e confirmar / ou retroceder. Você vai notar que, por vezes, de costas para as lacunas de preenchimento
FindOut_Quran

@FindOut_Quran Não vejo como isso pode acontecer. As colunas MS SQL IDENTITY usam um contador simples que é propagado em um valor definido pelo usuário e depois incrementado por um valor definível pelo usuário. Você pode até consultar e redefinir o contador. A única maneira de ver isso acontecendo é quando transações simultâneas confirmam "fora de ordem". Ou seja, a transação que estava bloqueando o contador de IDENTITY primeiro confirma após outra transação. Nesse caso, você terá uma lacuna de curta duração que será preenchida. O que é necessário para evitar colisões. O contador de IDENTIDADE nunca terá retrocedido.
Paul Groke

7

Ao usar o Tipo de dados: int, você pode selecionar a linha na qual deseja aumentar automaticamente e ir para a tag de propriedades da coluna. Lá você pode definir a identidade como 'yes'. O valor inicial do incremento automático também pode ser editado lá. Espero poder ajudar;)


onde estão localizadas as propriedades da coluna?

2

Eu tive esse problema em que eu já havia criado a tabela e não podia alterá-la sem soltar a tabela, então o que fiz foi: (Não tenho certeza de quando eles implementaram isso, mas o fizeram no SQL 2016)

Clique com o botão direito do mouse na tabela no Pesquisador de Objetos:

Script Table as > DROP And CREATE To > New Query Editor Window

Em seguida, faça a edição do script dito por Josien; role até a parte inferior onde CREATE TABLEestá, localize sua Chave Primária e anexe IDENTITY(1,1)ao final antes da vírgula. Execute o script.

O script DROP and CREATE também foi útil para mim por causa desse problema. (Com o qual o script gerado lida.)


1

Tenha cuidado como se você deseja que os elementos de identificação sejam contíguos ou não. Como o SQLSERVER ID pode aumentar em 1000.

Exemplo: antes de reiniciar o ID = 11 após o reinício, insira uma nova linha na tabela e o ID será 1012.


1

Você pode usar a palavra-chave IDENTITYcomo o tipo de dados da coluna junto com a PRIMARY KEYrestrição ao criar a tabela.
ex:

StudentNumber IDENTITY(1,1) PRIMARY KEY

Aqui o primeiro '1' significa o valor inicial e o segundo '1' é o valor incremental.


1
CREATE TABLE Persons (
    Personid int IDENTITY(1,1) PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
);

O MS SQL Server usa a palavra-chave IDENTITY para executar um recurso de incremento automático.

No exemplo acima, o valor inicial para IDENTITY é 1 e será incrementado em 1 para cada novo registro.

Dica: Para especificar que a coluna "Personid" comece no valor 10 e aumente em 5, altere-a para IDENTITY (10,5).

Para inserir um novo registro na tabela "Pessoas", NÃO precisaremos especificar um valor para a coluna "Pessoa" (um valor exclusivo será adicionado automaticamente):


0

Se a tabela já estiver preenchida, não é possível alterar uma coluna para a coluna IDENTITY ou convertê-la para a coluna não IDENTITY. Você precisaria exportar todos os dados para poder alterar o tipo de coluna para IDENTITY ou vice-versa e depois importar os dados novamente. Eu sei que é um processo doloroso, mas acredito que não há alternativa, exceto pelo uso da sequência, como mencionado neste post.


1
Você pode usar ALTER TABLE ... SWITCHapenas para alternar os metadados sem precisar tocar nos dados. Por exemplo, veja como definir o incremento automático após criar uma tabela sem perda de dados?
Martin Smith

1
O processo mencionado no link fornecido por você envolve a transferência dos dados para a tabela temporária e vice-versa, o que concorda com minha declaração acima. Se eu estiver errado, por favor me dê um exemplo de trabalho.
Softec 27/02

1
Há um exemplo de trabalho no link. Não há como "transferir os dados para a tabela temporária e vice-versa". `ALTER TABLE ... SWITCH` é apenas uma alteração de metadados. Não move nenhum dado.
Martin Smith
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.