Подтвердить что ты не робот

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... Даже не знаю, с чего начать отлаживать это. Я не из дискового пространства, и сама ошибка является незаметной.

4b9b3361

Ответ 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 миллиарда записей в вашей таблице, это может занять некоторое время...