Postgres:整数超出范围。为什么会发生此错误?

时间:2018-09-08 19:39:04

标签: sql postgresql type-conversion

我有两个查询。我希望它们都插入相同的值: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 :(得分: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;

Data Types


编辑

我们可以使用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   |

View on DB Fiddle

查询

您可以使用400*1024*1024*1024:: BIGINTint转换为bigint

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

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

View on DB Fiddle