Pergunta

O que acontece quando o SQL Server 2005 acontecerá a atingir o máximo para uma coluna de identidade? Será que começar desde o início e começar a recarregar a lacuna?

O que é o comportamento do SQL Server 2005 quando isso acontecer?

Foi útil?

Solução

Você receberá um erro de excesso quando o valor máximo é atingido . Se você usar o tipo de dados bigint com um valor máximo de 9,223,372,036,854,775,807 isso nunca vai muito provavelmente ser o caso.

A mensagem de erro que você obterá, será parecido com este:

Msg 220, Level 16, State 2, Line 10
Arithmetic overflow error for data type tinyint, value = 256.

(Fonte)

Tanto quanto eu sei MS SQL fornece nenhuma funcionalidade para preencher as lacunas de identidade, assim você terá que fazer isso por si mesmo ou alterar o tipo de dados da coluna de identidade.

Além disso, você pode definir o valor inicial para o número menor negativo, para obter uma gama ainda maior de valores de uso.

Aqui está um post bom blog sobre este tópico .

Outras dicas

Não vai preencher as lacunas. Em vez disso inserções irá falhar até que você altere a definição da coluna, quer deixar cair a identidade e encontrar outra maneira de preencher as lacunas ou aumentar o tamanho (ir de int para bigint) ou alterar o tipo de dados (de int para decimal ) para que mais valores de identidade estão disponíveis.

Você não será capaz de inserir novas linhas e receberá a mensagem de erro listada acima até que você corrigir o problema. Você pode fazer isso número um de maneiras. Se você ainda tiver dados e estão usando toda a id é abaixo do máximo, você vai ter que mudar o tipo de dados. Se os dados estiverem sendo purgado em uma base regular e você tem uma grande lacuna que não vai ser usado, você pode propagar novamente o número de identidade para o menor número no essa lacuna. Por exemplo, em um trabalho anterior, estávamos registrando transações. Tivemos talvez 40-50 milhões por mês, mas estávamos purgar tudo com mais de 6 meses, de modo que a cada poucos anos, a identidade iria chegar perto de 2 bilhões, mas nós não teríamos nada com um id abaixo de 1,5 bilhões de dólares, por isso seria propagar novamente volta a 0. Novamente, é possível que nenhum deles irá trabalhar para você e você vai ter que encontrar uma solução diferente.

Se a coluna de identidade é um inteiro, então o seu máximo é 2,147,483,647. Você vai ter um erro de estouro se você ultrapassá-lo.

Se você acha que isso é um risco, é só usar o tipo de dados BIGINT, o que lhe dá até 9.223.372.036.854.775.807. Não posso imaginar uma tabela de banco de dados com que muitas linhas.

Uma discussão mais aprofundada aqui . (O mesmo destino como xsl mencionado).

No caso de você acertar o número máximo para você coluna de identidade, você pode mover os dados dessa tabela em uma tabela secundária com um tipo de coluna de identidade maior e especificar o valor inicial para que o novo valor de identidade para ser o máximo do tipo anterior. Os novos valores de identidade continuará a partir desse ponto.

Se você excluir "valores antigos" de vez em quando você só precisa repor a semente usando DBCC CHECKIDENT ( 'MinhaTabela', RESEED, 0);

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top