web-dev-qa-db-ja.com

postgresql-範囲外の整数

なぜこれが起こっているのか、ちょっとした考えではありません。

それに応じてテーブルを設定しました:

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

つまり、これをデバッグし始める場所すらわからない..私はディスクスペースが不足していないわけではなく、エラー自体はちょっと目立たない..

16
Torxed

SERIAL列はINTEGERsとして格納され、最大値2が与えられます31-1。そのため、約20億回挿入すると、新しいid値は適合しなくなります。

テーブルの存続期間中にこれだけ多くの挿入が予想される場合は、BIGSERIAL(内部的にはBIGINT、最大263-1)。

後でSERIALが十分でないことを発見した場合、以下を使用して既存のフィールドのサイズを増やすことができます。

ALTER TABLE raw ALTER COLUMN id TYPE BIGINT;

ここではBIGINTではなくBIGSERIALであることに注意してください( シリアルは実数型ではありません )。また、テーブルに実際に20億のレコードがある場合、これには少し時間がかかる可能性があることに注意してください...

32
Nick Barnes