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
Я имею в виду comon... Даже не знаю, с чего начать отлаживать это. Я не из дискового пространства, и сама ошибка является незаметной.
Ответы
Ответ 1
SERIAL
столбцы хранятся как INTEGER
s, давая им максимальное значение 2 31 -1. Итак, после ~ 2 миллиардов вставок ваши новые значения id
больше не будут соответствовать.
Если вы ожидаете, что это много вставок за всю жизнь вашей таблицы, создайте его с помощью BIGSERIAL
(внутренне BIGINT
, максимум 2 63 -1).
Если позже вы обнаружите, что SERIAL
недостаточно велик, вы можете увеличить размер существующего поля с помощью:
ALTER TABLE raw ALTER COLUMN id TYPE BIGINT;
Обратите внимание, что здесь BIGINT
, а не BIGSERIAL
(поскольку сериалы не являются реальными типами). И имейте в виду, что если у вас на самом деле есть 2 миллиарда записей в вашей таблице, это может занять некоторое время...