1. ホーム
  2. postgresql

[解決済み] postgresql - 整数が範囲外です。

2022-02-10 05:38:46

質問

それに従ってテーブルを設定しました。

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

このテーブルをしばらくうまく使っていたのですが、突然以下の挿入がうまくいかなくなりました...。

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

というエラーが発生します。 ERROR: integer out of range

どこからデバッグを始めたらいいのかわからない。ディスク容量が足りないわけでもなく、エラー自体も控えめな感じです。

解決方法は?

SERIAL カラムは INTEGER で、最大値は2です。 31 -1. つまり、20億回の挿入の後、新しい id の値はもはや適合しない。

テーブルの使用期間中にこれだけの挿入が予想される場合、テーブルを BIGSERIAL (内部的には BIGINT であり、最大で2つの 63 -1).

を後から発見した場合 SERIAL で既存のフィールドのサイズを大きくすることができます。

ALTER TABLE raw ALTER COLUMN id TYPE BIGINT;

ただし、それは BIGINT でなく、ここで BIGSERIAL (として シリアルはリアルタイプではない ). また、実際にテーブルに20億のレコードがある場合、少し時間がかかるかもしれないことを心に留めておいてください...。