加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL – 在多列上创建索引时,Smallint溢出.这是一个错误吗

发布时间:2020-12-13 16:03:19 所属栏目:百科 来源:网络整理
导读:我在将问题32767插入Postgres中的smallint列时出现问题,这会导致错误smallint超出范围.这很奇怪,因为我能做到: SELECT 32767::int2; 哪个会好起来的.在拉了一下头发后,我终于将其追踪到了相关列的索引.首先,这是架构(嗯,不是真的,但我把它简化为一个repro案
我在将问题32767插入Postgres中的smallint列时出现问题,这会导致错误smallint超出范围.这很奇怪,因为我能做到:

SELECT 32767::int2;

哪个会好起来的.在拉了一下头发后,我终于将其追踪到了相关列的索引.首先,这是架构(嗯,不是真的,但我把它简化为一个repro案例):

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));

你只需要一个演员,但两者都不会受到伤害.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读