3

我知道您可以在 hstore 列中的字段上创建索引。我知道您还可以在数组列上创建 GIN 索引。

但是在 hstore 数组上创建索引的语法是什么?

例如

CREATE TABLE customer (
    pk serial PRIMARY KEY,
    customer hstore,
    customer_purchases hstore[]
);

假设客户购买的 hstore 可能是类似的哈希

productId -> 1
price -> 9.99

我在 customer_purchases hstore[] 中有一个数组

我想在 customer.customer_purchases[]-> productId 上创建一个索引

这可能吗?我尝试了 CREATE INDEX 语法的不同组合,但它们似乎都不支持 hstore 数组中的索引字段。

4

1 回答 1

5

我认为您误解了 PostgreSQL Array。AnArray实际上只是一个字符串。您不能索引HSTORE数组中的对象(在本例中为 s),因为它不是TABLE.

相反,创建一个额外的表:

CREATE TABLE customer (
    pk bigserial PRIMARY KEY,
    customer hstore
);

CREATE TABLE purchases (
    pk bigserial PRIMARY KEY,
    customer_pk bigint not null,
    purchase hstore not null,
    constraint "must be a valid customer!" 
        foreign key (customer_pk) references customer(pk)
);

另外,你为什么在这里使用HSTOREs ?

如果您必须INDEX基于"purchase" HSTORE此处创建一个,请执行以下操作:

CREATE OR REPLACE FUNCTION purchase_amount(purchase hstore) returns float as $$
    select ($1 -> 'price')::float;
$$ language 'SQL' IMMUTABLE;

CREATE INDEX "purchases by price" ON purchases (purchase_amount(purchase));

这只是理解HSTORE类型的练习吗?或者您是否有一些真实的用例可以使您对真实数据的所有这些混淆都值得?

于 2012-04-12T04:14:21.337 回答