Pregunta

Estoy haciendo una aplicación para ejecutarse en SQL Server y PostgreSQL, por lo que estoy haciendo esta pregunta acerca de los dos.

¿Qué ocurre cuando se crea una clave primaria única (usando una secuencia o escribe cosa incremento automático) y se golpea más de 4 mil millones de registros (32 bits)? No estoy diciendo que la mesa tendrá 4 mil millones de registros, sino que 4 mil millones de registros se han creado porque los únicos incrementos RID. Así que incluso si he eliminado 3,9 mil millones de estos registros, mis RID todavía están en el rango de 4 mil millones. ¿Así que lo que sucede? ¿Tiene la precisión de 64 bits o se vuelque a 0 o simplemente escupir un error muy crítico? Debería preocuparse de que incluso un poco con el tiempo pueda RID 64 de desbordamiento también?

Además, ¿cómo puedo luchar contra esto? ¿Hay algún tipo de limpieza de opción o herramienta? No sólo tengo que crear mi propia cosa a cada año más o menos completamente reconstruir la tabla para obtener RID consistentes? (Y por lo tanto implica también a una gran cantidad de otras tablas que utilizan estos RID son las claves externas)

¿Fue útil?

Solución

PostgreSQL, de forma predeterminada, el error y no se desborde:

# 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)

A partir de los documentos:

  

secuencias se basa en la aritmética bigint, por lo que el rango no puede exceder el rango de un número entero de ocho bytes (-9223372036854775808-9223372036854775807). En algunas plataformas de edad avanzada, puede haber ningún apoyo compilador para enteros de ocho bytes, en el que las secuencias de casos utilizan aritmética de enteros regular (intervalo comprendido entre -2147483648 +2147483647).

Sin embargo, usted puede hacer que el ciclo:

  

La opción de ciclo permite la secuencia para envolver alrededor cuando el maxvalue o MINVALUE ha sido alcanzada por una secuencia ascendente o descendente respectivamente. Si se alcanza el límite, el siguiente número generado será el MINVALUE o maxvalue, respectivamente.

     

Si no se especifica ningún ciclo, todas las llamadas a nextval después de la secuencia ha alcanzado su valor máximo devolverá un error. Si no se especifica ni CICLO DE CICLO o NO, NO CYCLE es el valor predeterminado.

No luchar contra él. Pasar los bytes adicionales y mantener las cosas simples. Es más probable que lamentar añadiendo capas adicionales de complejidad tareas de mantenimiento y / o de tener un espacio de claves más grande.

Otros consejos

En SQL Server: Depende del tipo de la columna RID. La identidad interna puede incrementar, pero no podrá asignar a la columna de 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')

desencadenantes este error:

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

Sin embargo, una columna numérica con suficiente capacidad de almacenamiento aumentarán muy bien:

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')

Del mismo modo un bigint será overlfow en 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')

pero con una columna numérica de almacenamiento suficiente tendrá éxito:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top