O que há de tão especial em uma coluna de identidade ?
Tenho certeza de que há um motivo válido, mas estou tentando entender melhor o SQL.
Então, o que há de tão especial em uma coluna de identidade que não pode ser facilmente adicionada em retrospectiva?
Por que isso não é apenas um único sinalizador int/bigint em algum lugar que está sendo incrementado toda vez que você insere uma nova linha?
Existe algo fisicamente armazenado por linha que este é um processo difícil?
Uma identidade não insere valores em uma tabela por si só, ela depende de um
INSERT
comando e as linhas antigas da sua tabela exigiriam umUPDATE
. Se você tentarUPDATE
uma coluna de identidade, receberá um erro como este:Cada recurso tem um propósito e limitações. A finalidade da identidade não é atualizar valores.
Na verdade é algo assim. O CREATE TABLE (Transact-SQL) IDENTITY (Propriedade) diz:
Portanto, sua
IDENTITY
coluna tem algo como um sinalizador que solicita ao SQL Server um desses valores ao inserir uma nova linha .Na seção Comentários do
IDENTITY
documento, você pode ver que o recurso tem algumas restrições e o motivo é:Se entendi sua pergunta corretamente, você não está perguntando como criar uma nova coluna com novos
IDENTITY
valores. Você está perguntando por que não podemos emitirALTER TABLE tbl ALTER COLUMN col int IDENTITY
em uma coluna existente.Como você disse, tudo isso é efetivamente uma
DEFAULT
restrição com um contador.A resposta que eu acho é simplesmente que nunca foi implementado , claramente poucas pessoas pediram por isso. Então temos que usar soluções alternativas.
Eu não acho que haja nenhuma grande dificuldade em adicionar esse recurso, além do fato de que ele teria que ser especificado, implementado e testado. Portanto, se você deseja esse recurso, vote no problema de feedback existente no Azure.
Tendo em mente o primeiro e o último parágrafo da resposta de Ronaldo, outra coisa a notar é que simplesmente não há mecanismo para adicionar um
IDENTITY
a uma tabela após o fato. AIDENTITY
coluna tem alguns parâmetros em torno dela, como o valor de semente e incremento, que podem até ser números negativos. UmaIDENTITY
coluna não precisa fazer parte da chave primária nem depende dela.Se alguém pudesse adicionar uma
IDENTITY
coluna a uma tabela após o fato, não haveria como correlacionar a quais linhas osIDENTITY
valores deveriam pertencer. Seria necessário haver mecanismos adicionais programados no SQL Server para fornecer uma maneira de especificar como oIDENTITY
pode gerar o valor apropriado para cada linha, talvez com umaORDER BY
cláusula.Mas mesmo isso não resolve todos os problemas, porque se o usuário especificar um conjunto não exclusivo de campos para
ORDER BY
(mas quiserIDENTITY
que seja exclusivo), o que deveIDENTITY
fazer? ... ele poderia escolher um aleatoriamente como aROW_NUMBER()
função de janela faz, mas isso tornaria aIDENTITY
função não determinística, o que não é uma ótima característica para umaIDENTITY
coluna. Ou poderia apenas gerar valores dupeIDENTITY
e não garantir exclusividade, o que é bom, mas não resolve o problema do usuário.Para encurtar a história, se a Microsoft quisesse fornecer uma maneira de adicionar uma
IDENTITY
coluna a uma tabela depois de preenchida com linhas, é possível, mas exigiria um pouco de reflexão sobre como isso deveria ser feito. Também é um recurso que não é frequentemente necessário, portanto, o design atual que restringe a capacidade de fazê-lo é geralmente aceitável.Você não pode adicionar uma identidade a uma coluna existente, mas pode começar a usar uma sequência.
https://learn.microsoft.com/it-it/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-ver15
Talvez isso possa lhe dar uma alternativa.
Você pode criar uma nova tabela vazia com uma
IDENTITY
coluna e usarALTER TABLE SWITCH
para alternar as linhas para a nova definição de tabela como uma operação somente de metadados, para que isso possa ser usado para alternar efetivamente a propriedade identity de maneira complicada.A
IDENTITY
propriedade é apenas uma propriedade de metadados em algumas tabelas do sistema e isso pode ser facilmente atualizável se implementado. Enquanto isso, o fato deALTER TABLE ... SWITCH
não exigir que essa propriedade seja a mesma na origem e no destino pode ser usado para conseguir isso efetivamente.Você ainda precisa descartar e renomear, mas ajuda porque apenas altera os metadados da tabela. Não há movimento de linhas e, no final, você acaba com exatamente os mesmos dados e páginas de índice associadas a uma tabela que agora contém uma
IDENTITY
coluna.Consulte Por que não há suporte para remover a propriedade Identity em uma coluna para obter um exemplo.