web-dev-qa-db-fra.com

postgresql - entier hors plage

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 ..

16
Torxed

Les colonnes SERIAL sont stockées en tant que INTEGERs, 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 ...

32
Nick Barnes