我有两个查询。我希望它们都插入相同的值: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
答案 0 :(得分:4)
要强制乘法输出bigint而不是int,可以将1强制转换为bigint并乘以
select cast(1 as bigint)*400*1024*1024*1024;
?column?
--------------
429496729600
答案 1 :(得分:1)
int
的最大值2 31 -1,第一个Update值大于该值,因此会引起erorr。
INT
-2147483648至+2147483647
您可以尝试让amount
列为BIGINT
键入
BIGINT
-9223372036854775808至9223372036854775807
ALTER TABLE order_detail ALTER COLUMN amount TYPE BIGINT;
编辑
我们可以使用pg_typeof
进行检出。
查询#1
postgresql 将429496729600
设为BIGINT
,因为该值大于int range。
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 |