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


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 |
Запрос
Вы можете использовать 400*1024*1024*1024:: BIGINT, позволяя int конвертировать в bigint.
SELECT 400*1024*1024*1024 :: BIGINT;
| ?column? |
| ------------ |
| 429496729600 |
хорошо спасибо. Покажи мне проблему. но другой ответ покажет, как решить эту проблему.
Чтобы заставить умножение выводить bigint вместо int, вы можете преобразовать 1 в bigint и умножить
select cast(1 as bigint)*400*1024*1024*1024;
?column?
--------------
429496729600
Ваше число больше целого. Перед вставкой первой вставки выполняется вычисление. Когда вы умножаете целое число, postgres ожидает в качестве результата целое число. Это не так.