Pergunta

Estou fazendo um aplicativo para executar no SQL Server e PostgreSQL, por isso estou fazendo essa pergunta sobre os dois.

O que acontece sempre que você cria uma chave primária única (usando uma sequência ou tipo de incremento automático) e atinge mais de 4 bilhões de registros (32 bits)? Não estou dizendo que nossa tabela terá 4 bilhões de registros, mas que 4 bilhões de registros foram criados porque o RID apenas incrementos. Portanto, mesmo que eu excluísse 3,9 bilhões desses registros, meus livros ainda estão na faixa de 4 bilhões. Então, o que acontece? Isso aumenta a precisão para 64 bits ou rola para 0 ou apenas cuspa um erro muito crítico? Devo me preocupar que mesmo um RID de 64 bits também possa eventualmente transbordar também?

Além disso, como posso lutar contra isso? Existe algum tipo de opção ou ferramenta de limpeza? Eu só tenho que criar minhas próprias coisas para reconstruir todos os anos para se livrar completamente para se livrar consistente? (e, portanto, também tocam muitas outras tabelas que usam esses livros são chaves estrangeiras)

Foi útil?

Solução

PostGresql, por padrão, erro e não transbordam:

# create sequence willyouwrap;
CREATE SEQUENCE
# select setval('willyouwrap', 9223372036854775807);
       setval        
---------------------
 9223372036854775807
(1 row)
# select nextval('willyouwrap');
ERROR:  nextval: reached maximum value of sequence "willyouwrap" (9223372036854775807)

Dos documentos:

As sequências são baseadas na aritmética do BIGINT, portanto o intervalo não pode exceder o intervalo de um número inteiro de oito bytes (-9223372036854775808 a 92233720368547775807). Em algumas plataformas mais antigas, pode não haver suporte ao compilador para inteiros de oito bytes; nesse caso, as seqüências usam aritmética inteira regular (variação -2147483648 a +2147483647).

No entanto, você pode fazer o ciclo:

A opção de ciclo permite que a sequência envolva quando o MaxValue ou o minvalue for alcançado por uma sequência ascendente ou descendente, respectivamente. Se o limite for atingido, o próximo número gerado será o MinValue ou o MaxValue, respectivamente.

Se nenhum ciclo for especificado, quaisquer chamadas para NextVal após a sequência atingirem seu valor máximo retornará um erro. Se nenhum ciclo ou nenhum ciclo for especificado, nenhum ciclo é o padrão.

Não lute. Passe os bytes extras e mantenha as coisas simples. É mais provável que você se arrependa de adicionar camadas extras de complexidade e/ou tarefas de manutenção do que ter um espaço de chave maior.

Outras dicas

No servidor SQL: depende do tipo de coluna RID. A identidade interna pode aumentar, mas não atribuirá à coluna Stoarge:

CREATE TABLE [t1] (
[tid] int IDENTITY (2147483647, 1) NOT NULL
  , name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')

Isso desencadeia um erro:

Msg 8115, Level 16, State 1, Line 2
Arithmetic overflow error converting IDENTITY to data type int.
Arithmetic overflow occurred.

Mas uma coluna numérica com armazenamento suficiente irá incrementar muito bem:

CREATE TABLE [t1] (
[tid] numeric(38,0) IDENTITY (2147483647, 1) NOT NULL
  , name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')

Da mesma forma, um bigint se destaca em 2 ^^ 63-1:

CREATE TABLE [t1] (
[tid] bigint IDENTITY (9223372036854775807, 1) NOT NULL
  , name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')

Mas uma coluna numérica com armazenamento suficiente terá sucesso:

CREATE TABLE [t1] (
[tid] numeric(38,0) IDENTITY (9223372036854775807, 1) NOT NULL
  , name varchar(1)
) ON [PRIMARY]
GO
insert into t1(name) values('1')
insert into t1(name) values('1')
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top