Pas la moindre idée pourquoi diable cela se passe ..
J'ai mis en place une table en conséquence:
CREATE TABLE raw (
id SERIAL,
regtime float NOT NULL,
time float NOT NULL,
source varchar(15),
sourceport INTEGER,
destination varchar(15),
destport INTEGER,
blocked boolean
); ... + index and grants
J'ai utilisé ce tableau avec succès depuis un moment maintenant, et tout à coup l'insert suivant ne fonctionne plus.
INSERT INTO raw(
time, regtime, blocked, destport, sourceport, source, destination
) VALUES (
1403184512.2283964, 1403184662.118, False, 2, 3, '192.168.0.1', '192.168.0.2'
);
L'erreur est: ERROR: integer out of range
Je veux dire commun ... Je ne sais même pas par où commencer le débogage .. Je ne suis pas à court d'espace disque et l'erreur elle-même est un peu discrète ..
Les colonnes SERIAL
sont stockées en tant que INTEGER
s, leur donnant une valeur maximale de 231-1. Ainsi, après ~ 2 milliards d'insertions, vos nouvelles valeurs id
ne conviendront plus.
Si vous attendez autant d'insertions sur la durée de vie de votre table, créez-la avec un BIGSERIAL
(en interne un BIGINT
, avec un maximum de 263-1).
Si vous découvrez plus tard qu'un SERIAL
n'est pas assez grand, vous pouvez augmenter la taille d'un champ existant avec:
ALTER TABLE raw ALTER COLUMN id TYPE BIGINT;
Notez que c'est BIGINT
ici, plutôt que BIGSERIAL
(comme les séries ne sont pas de vrais types ). Et gardez à l'esprit que si vous avez réellement 2 milliards d'enregistrements dans votre table, cela peut prendre un peu de temps ...