AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 289583
Accepted
Dirk Boer
Dirk Boer
Asked: 2021-04-10 19:57:27 +0800 CST2021-04-10 19:57:27 +0800 CST 2021-04-10 19:57:27 +0800 CST

Por que você não pode adicionar uma identidade a uma coluna existente no SQL Server?

  • 772

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?

sql-server alter-table
  • 5 5 respostas
  • 466 Views

5 respostas

  • Voted
  1. Ronaldo
    2021-04-11T03:32:14+08:002021-04-11T03:32:14+08:00

    Então, o que há de tão especial em uma coluna de identidade que não pode ser facilmente adicionada em retrospectiva?

    Uma identidade não insere valores em uma tabela por si só, ela depende de um INSERTcomando e as linhas antigas da sua tabela exigiriam um UPDATE. Se você tentar UPDATEuma coluna de identidade, receberá um erro como este:

    Msg 8102, Level 16, State 1, Line 8
    Não é possível atualizar a coluna de identidade 'ColumnName'.

    Cada recurso tem um propósito e limitações. A finalidade da identidade não é atualizar valores.


    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?

    Na verdade é algo assim. O CREATE TABLE (Transact-SQL) IDENTITY (Propriedade) diz:

    O SQL Server pode armazenar em cache valores de identidade por motivos de desempenho e alguns dos valores atribuídos podem ser perdidos durante uma falha de banco de dados ou reinicialização do servidor.

    Portanto, sua IDENTITYcoluna tem algo como um sinalizador que solicita ao SQL Server um desses valores ao inserir uma nova linha .

    Na seção Comentários do IDENTITYdocumento, você pode ver que o recurso tem algumas restrições e o motivo é:

    Essas restrições fazem parte do projeto para melhorar o desempenho e porque são aceitáveis ​​em muitas situações comuns.

    • 4
  2. Best Answer
    Charlieface
    2021-04-12T06:25:19+08:002021-04-12T06:25:19+08:00

    Se entendi sua pergunta corretamente, você não está perguntando como criar uma nova coluna com novos IDENTITYvalores. Você está perguntando por que não podemos emitir ALTER TABLE tbl ALTER COLUMN col int IDENTITYem uma coluna existente.

    Como você disse, tudo isso é efetivamente uma DEFAULTrestriçã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.

    • 4
  3. J.D.
    2021-04-11T04:48:18+08:002021-04-11T04:48:18+08:00

    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 IDENTITYa uma tabela após o fato. A IDENTITYcoluna tem alguns parâmetros em torno dela, como o valor de semente e incremento, que podem até ser números negativos. Uma IDENTITYcoluna não precisa fazer parte da chave primária nem depende dela.

    Se alguém pudesse adicionar uma IDENTITYcoluna a uma tabela após o fato, não haveria como correlacionar a quais linhas os IDENTITYvalores deveriam pertencer. Seria necessário haver mecanismos adicionais programados no SQL Server para fornecer uma maneira de especificar como o IDENTITYpode gerar o valor apropriado para cada linha, talvez com uma ORDER BYclá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 quiser IDENTITYque seja exclusivo), o que deve IDENTITYfazer? ... ele poderia escolher um aleatoriamente como a ROW_NUMBER()função de janela faz, mas isso tornaria a IDENTITYfunção não determinística, o que não é uma ótima característica para uma IDENTITYcoluna. Ou poderia apenas gerar valores dupe IDENTITYe 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 IDENTITYcoluna 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.

    • 1
  4. MBuschi
    2021-04-11T07:13:22+08:002021-04-11T07:13:22+08:00

    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.

    • 1
  5. user232822
    2021-06-18T00:46:45+08:002021-06-18T00:46:45+08:00

    Você pode criar uma nova tabela vazia com uma IDENTITYcoluna e usar ALTER TABLE SWITCHpara 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 IDENTITYpropriedade é apenas uma propriedade de metadados em algumas tabelas do sistema e isso pode ser facilmente atualizável se implementado. Enquanto isso, o fato de ALTER TABLE ... SWITCHnã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 IDENTITYcoluna.

    Consulte Por que não há suporte para remover a propriedade Identity em uma coluna para obter um exemplo.

    • 1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve