Error integer out of range
Я соответствующим образом настроил таблицу:
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 столбцы хранятся как INTEGERs, что дает им максимальное значение 2 31-1. Итак, после ~ 2 миллиардов вставок ваши новые idзначения больше не будут соответствовать.
Если вы ожидаете такого количества вставок в течение срока службы вашей таблицы, создайте ее с помощью a BIGSERIAL(внутренне a BIGINT, максимум 2 63-1).
Если позже вы обнаружите, что a SERIALнедостаточно велико, вы можете увеличить размер существующего поля с помощью:
ALTER TABLE raw ALTER COLUMN id TYPE BIGINT;
Обратите внимание, что оно BIGINTздесь, а не BIGSERIAL(поскольку сериалы не являются реальными типами). И имейте в виду, что, если у вас на самом деле есть 2 миллиарда записей в вашей таблице, это может занять некоторое время…
U130: целое число вне диапазона
Категория: Ошибки приложения / пользователя
SQLSTATE: 22003 (Класс 22 — Исключение данных: numeric_value_out_of_range)
Срочность: средняя
Пример вывода журнала Postgres:
ERROR: integer out of range
STATEMENT: INSERT INTO x(y) VALUES (10000000000000)
Объяснение:
Вы пытались ВСТАВИТЬ целочисленное значение в таблицу, которая превышает диапазон базового целочисленного типа данных в указанном столбце.
Самый простой пример этого – когда вы буквально вставляете слишком большое значение в базу данных. В таких случаях это может быть либо ошибка в вашем потоке приема, либо неправильный тип данных в базе данных.
Однако наиболее распространенным случаем, когда это происходит, является использование последовательностей (т. Е. SERIALТипа данных) для вашего столбца первичного ключа и вставка такого количества записей, что достигаются пределы базового типа данных, обычно это означает 2147483647записи с integerSERIALтипом данных или.
Вы также можете увидеть эту проблему в любых связанных таблицах, которые ссылаются на столбец, используя целочисленную последовательность для его первичного ключа, где вам также нужно следить за значением столбца, не превышающим 2147483647для integerтипа данных.
К сожалению, многие платформы веб-разработки и ORM по-прежнему по умолчанию используют integerстолбцы для своих первичных ключей, которые используют последовательности, что означает, что вы столкнетесь с этой проблемой в какой-то момент в будущем.
Для этой цели настоятельно рекомендуется отслеживать значения последовательности, например, выполнив следующее:
SELECT last_value FROM my_table_id_seq;
Вы также можете выбрать просто всегда использовать bigintдля всех столбцов, связанных с последовательностью, чтобы избежать возникновения этой проблемы.
Обратите внимание, что игнорирование этой ошибки, скорее всего, приведет к потере данных, поэтому, если вы не сможете восстановиться после сбоев вставки, эту ошибку необходимо устранить немедленно.
Рекомендуемое действие:
Увеличьте размер столбца, выполнив следующие действия:
ALTER TABLE x ALTER COLUMN y TYPE bigint;
Обратите внимание, что при перезаписи таблицы потребуется эксклюзивная блокировка, поэтому вам может потребоваться сначала добавить новый столбец и заполнить его, например:
— Deploy this schema change and have your application always write to y_new as well:
ALTER TABLE x ADD COLUMN y_new TYPE bigint;
— Backfill all existing columns:
UPDATE x SET y_new = y WHERE y_new IS NULL;
— Drop old column and rename the new column to take its place
ALTER TABLE x DROP COLUMN y;
ALTER TABLE x ALTER COLUMN y_new RENAME TO y;
При использовании второго подхода будьте осторожны, чтобы также указать любые дополнительные параметры (например, значение по умолчанию для последовательности), а также установить любые ограничения NOT NULL в конце.