首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PostgreSQL 13中是否有unix时间戳范围函数?

PostgreSQL 13中是否有unix时间戳范围函数?
EN

Database Administration用户
提问于 2023-03-31 06:57:32
回答 1查看 38关注 0票数 1

我有一个存储用户订阅信息的表,现在我想添加一个约束,使用户在相同的时间内没有多次订阅该产品。我被试着这样做:

代码语言:javascript
复制
CREATE INDEX user_sub_exclusion_index ON user_sub USING GIST (
  user_id,
  tsrange(sub_start_time, sub_end_time)
);

并创建约束:

代码语言:javascript
复制
ALTER TABLE user_sub ADD CONSTRAINT user_sub_exclusion_constraint EXCLUDE USING GIST (
  user_id WITH =,
  tsrange(sub_start_time, sub_end_time) WITH &&
);

似乎tsrange需要时间戳数据类型。我试过量程功能,但没有起作用。如何使gist索引工作并且没有更改数据类型?这是DDL表:

代码语言:javascript
复制
CREATE TABLE public.user_sub (
    id int8 NOT NULL GENERATED ALWAYS AS IDENTITY,
    app_id varchar NOT NULL,
    product_id int4 NOT NULL,
    iap_product_id varchar NOT NULL,
    created_time int8 NOT NULL,
    updated_time int8 NOT NULL,
    user_id int8 NOT NULL,
    sub_start_time int8 NOT NULL DEFAULT 0,
    sub_end_time int8 NOT NULL DEFAULT 0,
    enabled int2 NOT NULL DEFAULT 1,
    order_id varchar NOT NULL,
    CONSTRAINT user_sub_new_pk PRIMARY KEY (id),
    CONSTRAINT user_sub_new_un UNIQUE (order_id)
);

我尝试将字段更改为时间戳,并对sql进行如下调整:

代码语言:javascript
复制
CREATE INDEX user_sub_exclusion_index ON user_sub USING GIST (
  user_id,
  tstzrange(sub_start, sub_end)
);

显示错误:

代码语言:javascript
复制
SQL Error [42704]: ERROR: data type bigint has no default operator class for access method "gist"
  Hint: You must specify an operator class for the index or define a default operator class for the data type.

我应该怎么做才能添加约束?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2023-03-31 12:25:31

默认情况下,PostgreSQL不包括基本类型(如bigint )的GiST运算符类。您必须创建一个标准扩展,该扩展提供所需的运算符类:

代码语言:javascript
复制
CREATE EXTENSION btree_gist;

然后,您可以创建约束。

注意,添加排除约束会自动创建GiST索引。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/325438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档