sql - PostgreSQL - 在多列上创建索引时 Smallint 溢出。这是一个错误吗?

标签 sql postgresql postgresql-9.0

我在将值 32767 插入 Postgres 的 smallint 列时遇到问题,这会产生错误 smallint out of range。这很奇怪,因为我可以:

SELECT 32767::int2;

哪个会工作得很好。经过一番纠结之后,我终于找到了相关列的索引。首先,这是架构(好吧,不是真的,但我已将其简化为一个重现案例):

CREATE TABLE Test
(
  id uuid NOT NULL,
  cooktime smallint,
  preptime smallint,
  CONSTRAINT test_pkey PRIMARY KEY (id )
)
WITH (
  OIDS=FALSE
);

我现在创建以下索引:

CREATE INDEX idx_test_totaltime
  ON Test
  USING btree
  ((cooktime + preptime) );

接下来,我尝试创建以下行:

INSERT INTO Test (CookTime, PrepTime, Id)
VALUES (
  (32767)::int2,
  (10)::int2,
  (E'fd47dc1e-c3c6-42c1-b058-689e926a72a4')::uuid
);

我得到错误:

ERROR: smallint out of range SQL state: 22003

似乎 idx_test_totaltime 期望最大值为 int2,即使该索引应用于两个 smallint 的总和。

这是一个 Postgres 错误,还是我遗漏了一些简单的东西?有没有办法解决这个限制,或者我是否需要将这些列设为 int4 并使用 CHECK 约束将每个值限制为 32767?我正在使用 Postgres 9.0.0(是的,我需要升级!)但我创建了一个 SQL Fiddle这在 9.1.4 上演示了此错误。

最佳答案

你的问题是 int2 + int2 是另一个 int2 所以你的索引中的表达式 (cooktime + preptime) 溢出 (32767, 10)。您可以通过在索引表达式中进行一些转换来解决这个问题:

CREATE INDEX idx_test_totaltime
  ON Test
  USING btree
  ((cooktime::int4 + preptime::int4));

您只需要其中一个转换,但同时使用两个也没有坏处。

关于sql - PostgreSQL - 在多列上创建索引时 Smallint 溢出。这是一个错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11814132/

相关文章:

PHP以正确的顺序从五个不同的表中检索信息

postgresql - 错误 : op ANY/ALL (array) requires array on right side

postgresql - 是否可以在 Postgres 的索引中使用稳定函数?

sql - 带/不带传递参数的条件存储过程

mysql - 从两个表在 SQL 中生成报告

sql - 斯卡拉 Spark : Parse SQL string to Column

postgresql - 将 Postgres 对象添加到 Template1

java - PostgreSQL : syntax error at and near null

database - postgresql 中的指数问题

mysql - postgresql 中的 DATE_FORMAT