Postgres: целое число вне диапазона. Почему эта ошибка возникает? - PullRequest
0 голосов
/ 08 сентября 2018

У меня два запроса. Я ожидаю, что оба вставят одно и то же значение: 429496729600, но один из них завершится ошибкой из-за ошибки:

db=> update order_detail set amount = 400*1024*1024*1024 where id = 11;
ERROR:  integer out of range
db=> update order_detail set amount = 429496729600 where id = 11;
UPDATE 1

Почему ошибка возникает при первом запросе?

UPD
Забудьте указать, что тип amount равен bigint, а

400*1024*1024*1024 == 429496729600  

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Чтобы заставить умножение выводить bigint вместо int, вы можете привести 1 к bigint и умножить

select cast(1 as bigint)*400*1024*1024*1024;
   ?column?
--------------
 429496729600
0 голосов
/ 08 сентября 2018

int максимальное значение 2 31 -1, первое значение обновления больше, чем оно, так что вызовите ошибку.

INT -2147483648 до + 2147483647

Вы можете попробовать amount столбец BIGINT Тип

BIGINT -9223372036854775808 до 9223372036854775807

ALTER TABLE order_detail ALTER COLUMN amount TYPE BIGINT;

Типы данных


EDIT

мы можем использовать pg_typeof, чтобы проверить это.

Запрос № 1

postgresql позволит 429496729600 быть BIGINT из-за значения, превышающего диапазон int.

SELECT pg_typeof(429496729600 );

| pg_typeof |
| --------- |
| bigint    |

Запрос № 2

При умножении на число, которое будет переводиться в int.

SELECT pg_typeof( 1*15*1  );

| pg_typeof |
| --------- |
| integer   |

Посмотреть на БД Fiddle

Запрос

Вы можете использовать 400*1024*1024*1024:: BIGINT let int преобразовать в bigint.

SELECT 400*1024*1024*1024 :: BIGINT;

| ?column?     |
| ------------ |
| 429496729600 |

Просмотр на БД Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...