なぜこれが起こっているのか、ちょっとした考えではありません。
それに応じてテーブルを設定しました:
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
sとして格納され、最大値2が与えられます31-1。そのため、約20億回挿入すると、新しいid
値は適合しなくなります。
テーブルの存続期間中にこれだけ多くの挿入が予想される場合は、BIGSERIAL
(内部的にはBIGINT
、最大263-1)。
後でSERIAL
が十分でないことを発見した場合、以下を使用して既存のフィールドのサイズを増やすことができます。
ALTER TABLE raw ALTER COLUMN id TYPE BIGINT;
ここではBIGINT
ではなくBIGSERIAL
であることに注意してください( シリアルは実数型ではありません )。また、テーブルに実際に20億のレコードがある場合、これには少し時間がかかる可能性があることに注意してください...