【问题标题】:Postgres: integer out of range. Why this error occur?Postgres:整数超出范围。为什么会出现这个错误?
【发布时间】:2019-02-13 18:23:11
【问题描述】:

我有两个问题。我希望两者都插入相同的值: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 期望 Integer 作为结果。它不是这样失败的。

标签: sql postgresql type-conversion


【解决方案1】:

int最大值为231-1,第一个Update值大于它所以会报错。

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 范围。

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:: BIGINT 让int 转换为bigint。

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

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

View on DB Fiddle

【讨论】:

  • 好的,谢谢。你给我看问题。但另一个答案显示了如何解决它。
【解决方案2】:

要强制乘法输出 bigint 而不是 int,您可以将 1 转换为 bigint 并相乘

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

【讨论】:

  • 你能解释一下为什么你的解决方案有效吗(顺便谢谢你 :-D)但是这个不行:CAST((400*1024*1024*1024) AS bigint)?
  • @jeffdill2 因为在您的示例中,乘法是在强制转换之前完成的,并且由于乘法中的每个项都是一个 int,因此结果也是一个 int 并且结果太大而无法放入 int 中。
  • 啊,当然!谢谢。 ?
猜你喜欢
  • 2016-08-22
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 2020-03-22
  • 1970-01-01
  • 2023-03-30
相关资源
最近更新 更多