没有丝毫想到为什么会发生这种情况......
我已相应地设置了一个表格:
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
我的意思是comon ... 甚至不确定从哪里开始调试这个..我不是没有磁盘空间而且错误本身有点谨慎..
答案 0 :(得分:30)
SERIAL
列存储为INTEGER
s,最大值为2 31 -1。因此,在大约20亿次插入后,您的新id
值将不再适合。
如果您希望在表格的整个生命周期中使用这么多插页,请使用BIGSERIAL
创建它(内部为BIGINT
,最多为2 63 -1)
如果您稍后发现SERIAL
不够大,可以使用以下内容增加现有字段的大小:
ALTER TABLE raw ALTER COLUMN id TYPE BIGINT;
请注意,这里BIGINT
而不是BIGSERIAL
(serials aren't real types)。请记住,如果您的表中实际上有20亿条记录,这可能需要一段时间......