我有一个存储用户订阅信息的表,现在我想添加一个约束,使用户在相同的时间内没有多次订阅该产品。我被试着这样做:
CREATE INDEX user_sub_exclusion_index ON user_sub USING GIST (
user_id,
tsrange(sub_start_time, sub_end_time)
);并创建约束:
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表:
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进行如下调整:
CREATE INDEX user_sub_exclusion_index ON user_sub USING GIST (
user_id,
tstzrange(sub_start, sub_end)
);显示错误:
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.我应该怎么做才能添加约束?
发布于 2023-03-31 12:25:31
默认情况下,PostgreSQL不包括基本类型(如bigint )的GiST运算符类。您必须创建一个标准扩展,该扩展提供所需的运算符类:
CREATE EXTENSION btree_gist;然后,您可以创建约束。
注意,添加排除约束会自动创建GiST索引。
https://dba.stackexchange.com/questions/325438
复制相似问题