Главная » Error » Error integer out of range

Error integer out of range

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 в конце.

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...

Добавить комментарий

Adblock
detector