Postgres中是否有MAX_INT常量?

35
在Java中,我可以使用 Integer.MAX_VALUE 获取 int 类型所能容纳的最大数字。
Postgres中是否有类似的常量/函数?我想避免硬编码该数字。
编辑:我提出这个问题的原因是:有一个旧表,其ID是 integer 类型,由序列支持。该表有大量输入行。我想计算在 integer 用完之前还有多少时间,因此需要知道“剩余的ID数量”除以“我们花费它们的速度”。

不,没有这样的常量。它应该放在哪里?数据库中没有预定义的“类”,例如Integer。如果您想要,可以编写一个简单返回2147483647的函数。 - user330315
6
@a_horse_with_no_name 嗯,SQL 中有很多预定义和魔法常量,包括 postgres:例如 CURRENT_TIMESTAMP。对我来说,在 SQL 中有一个 MAX_INT / INT_MAX 并不会显得格格不入。或者,就像 C 语言中的 sizeof() 函数一样。 - IMSoP
2
SQL中的预定义函数没有暴露_实现_细节。SQL实际上不涉及像sizeof()这样的底层信息,因为SQL的目标是解除您对此的需求。您可以查询_value_的大小,但不能查询数据类型的大小。真正的问题是:您为什么认为您需要它?您试图通过它解决的根本问题是什么? - user330315
@a_horse_with_no_name 编辑后加入了我提问的原因。 - vektor
为什么不把这一列改成 bigint 呢?但是为了检查是否会“耗尽”,你可以使用一个硬编码的值。这种情况不会很快发生变化。 - user330315
3
不幸的是,“遗留”意味着如果不必要,转换为bigint会很昂贵,并且将被推迟。因此需要进行“用尽”检查。最佳编程实践要求如果有常量可用,则使用常量,因此有这些问题 :) - vektor
2个回答

19

这个并没有一个固定的常数,但我认为在Postgres中将数字硬编码比在Java中更为合理。

在Java中,哲学上的目标是使Integer成为一个抽象值,因此你会想要表现得好像你不知道最大值是多少。

在Postgres中,你更接近裸机,而integer类型的定义是4字节有符号整数


在C语言中,int的大小也是抽象的,而Postgres就是用C语言编写的。 - sudo
2
Postgres中的integer与C语言中的int不同。 - Nathaniel Waisbrot
是的。抱歉,我不是说它在Postgres中被抽象化了。Postgres独立定义其整数限制。 - sudo
5
我认为你对Java的理解有误,将int设为4个字节是他们核心设计决策之一,因为(据我所知)他们不希望出现在C/C++中与int大小不同相关的混乱问题(实际上这是由于C/C++编译器被编写用于各种CPU架构造成的)。如果Java打算将int作为抽象值,他们就不会有longshort等类型存在。 - Andy

2
有一个以整数类型ID为属性的遗留表,由序列支持。
在这种情况下,您可以通过以下方式获取序列的最大值: select seqmax from pg_sequence where seqrelid = 'your_sequence_name'::regclass。 这可能比获取MAX_INT更好,因为序列可能已经被创建/更改为具有与MAX_INT不同的特定最大值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接