Postgres: целое число вне допустимого диапазона. Почему возникает эта ошибка?

У меня два вопроса. Я ожидаю, что оба вставят одно и то же значение: 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  

Ваше число больше целого. Перед вставкой первой вставки выполняется вычисление. Когда вы умножаете целое число, postgres ожидает в качестве результата целое число. Это не так.

wargre 08.09.2018 21:45
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
5
1
14 717
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

INT -2147483648 to +2147483647

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

BIGINT-9223372036854775808 to 9223372036854775807

ALTER TABLE order_detail ALTER COLUMN amount TYPE BIGINT;

Типы данных


РЕДАКТИРОВАТЬ

мы можем использовать 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   |

Посмотреть на DB Fiddle

Запрос

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

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

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

Посмотреть на DB Fiddle

хорошо спасибо. Покажи мне проблему. но другой ответ покажет, как решить эту проблему.

Eugen Konkov 08.09.2018 21:57
Ответ принят как подходящий

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

select cast(1 as bigint)*400*1024*1024*1024;
   ?column?
--------------
 429496729600

Другие вопросы по теме