我在将值 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/