2008-12-12 14 views
21

Considérese una sencilla tabla con una columna de incremento automático de esta manera:¿Qué sucede cuando se agota una columna de incremento automático?

CREATE TABLE foo 
(
    `fooid` bigint unsigned NOT NULL auto_increment, 
    ....snipped.... other columns 
    PRIMARY KEY (`fooid`) 
) 
ENGINE=InnoDB AUTO_INCREMENT=10 

¿Cómo se puede rediseñar esto para que no pegamos al máximo del tipo de datos bigint? El rango sin signo es 0 a 18446744073709551615. No sé cuánto tiempo llevará alcanzar 18446744073709551615, pero al igual que el problema del año 2000, quiero estar listo para ello.

Respuesta

55

Supongamos que inserta una fila cada milisegundo.

18446744073709551615 millseconds = 18446744073709552 segundo = 307445734561826 minutos = 5124095576030 hora = 213503982335 días = 584.942.417 años

Así que no es realmente como el problema Y2K

Usted puede insertar un millones de filas por milisegundo y aún así estar bien por más de 500 años.

En otras palabras: no te preocupes por eso.

+1

Ok. No creo que mi aplicación dure tanto => 500 años. – ashitaka

+2

Del mismo modo, si solo inserta una vez por segundo, su aplicación se ejecutará durante 68 años con un int. Firmado de 32 bits. Ahórrese 4 bytes por registro y use int int de 32 bits si puede. – jmucchiello

+0

En segundo lugar. Hay cosas que necesitan más precaución al construir una base de datos. – Tomalak

18

Dependiendo de SQL mode que esté utilizando, MySQL hace una de estas dos cosas cuando el valor de una columna numérica AUTO_INCREMENT crece fuera del rango. Se obtiene un error en cualquier caso, pero por diferentes razones.

En modo estricto MySQL rechaza el valor fuera de rango, arroja un error de valor no válido y el INSERT falla. En el modo predeterminado no estricto MySQL reduce el valor al más alto permitido para el tipo de datos, y realiza el INSERT. Pero el INSERT falla porque el atributo AUTO_INCREMENT ha causado todos los valores posibles para estar ya en uso, y se obtiene este error (sin firmar SMALLINT ejemplo):

MySQL said: 

#1062 - Duplicate entry '65535' for key 1 

Para el ejemplo BIGINT aquí, sustituya el "65535" con 18 quintillones, aunque no es probable que este error haya ocurrido alguna vez en una base de datos de producción.

Pero con TINYINT sy SMALLINT s puede suceder muy fácilmente si se subestiman los posibles valores de clave (número de INSERT s) durante la vida útil de una aplicación. Imagine que está haciendo cambios en su código y prueba que sus datos se inserten correctamente. De repente, su aplicación deja de funcionar con el error anterior. Retira los cambios al código bueno conocido, pero el error no desaparecerá ... muy frustrante.

2

No sé nada de MySQL, pero en el caso de Postgresql, puede especificar si la secuencia es CICLO/NO CICLO. Si se crea con una opción CYCLE, regresará nuevamente a 1 (o al valor mínimo) y lanzará el error para la clave duplicada.

+2

No disponible en MySQL. –

Cuestiones relacionadas