gpt4 book ai didi

json - 嵌入式 json 对象的唯一索引

转载 作者:行者123 更新时间:2023-11-29 11:34:27 25 4
gpt4 key购买 nike

我现在正在测试 Postgresql 9.4 beta2。我想知道是否可以在嵌入式 json 对象上创建唯一索引?

我创建了一个表名products:

CREATE TABLE products (oid serial primary key, data jsonb)

现在,我尝试将 json 对象插入到数据列中。

{
"id": "12345",
"bags": [
{
"sku": "abc123",
"price": 0,
},
{
"sku": "abc123",
"price": 0,
}
]
}

但是,我希望包的 sku 是唯一的。这意味着 json 无法插入到产品表中,因为 sku 在这种情况下不是唯一的。

我尝试创建如下所示的唯一索引,但失败了。

CREATE UNIQUE INDEX product_sku_index ON products( (data->'bags'->'sku') )

有什么建议吗?

最佳答案

由于多种原因,您尝试在表达式上创建UNIQUE INDEX 注定会失败。

在产品上创建唯一索引 product_sku_index((data->'bags'->'sku'))

第一个也是最微不足道的是......
data->'bags'->'sku'
引用任何。您可以使用

引用数组的 第一个元素
data->'bags'->0->>'sku'

或更短:

data#>>'{bags,0,sku}'

但是那个表达式只返回数组的第一个值。
您的定义:“我希望袋子的 sku 是独一无二的” .. 不清楚。您希望 sku 的值是唯一的吗?在 data 列中的一个 JSON 对象或所有 json 对象之间?或者您想将数组限制为具有 sku 的单个元素?

无论哪种方式,这些目标都不能通过简单的 UNIQUE 索引来实现。

可能的解决方案

如果您希望 sku valuesdata->'bags' 中的所有 json 数组中是唯一的,有一种方法。取消嵌套数组并将所有单独的 sku 值写入具有唯一(或 PK)约束的简单辅助表中的分隔行:

CREATE TABLE prod_sku(sku text PRIMARY KEY);  -- PK enforces uniqueness

此表可能对其他用途有用。
这是一个完整的代码示例,用于解决与普通 Postgres 数组非常相似的问题:

只采用取消嵌套技术。而不是:

DELETE FROM hostname h
USING unnest(OLD.hostnames) d(x)
WHERE h.hostname = d.x;

...

INSERT INTO hostname(hostname)
SELECT h
FROM unnest(NEW.hostnames) h;

使用:

DELETE FROM prod_sku p
USING jsonb_array_elements(NEW.data->'bags') d(x)
WHERE p.sku = d.x->>'sku';

...

INSERT INTO prod_sku(sku)
SELECT b->>'sku'
FROM jsonb_array_elements(NEW.data->'bags') b

那个的详细信息:

关于json - 嵌入式 json 对象的唯一索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25959181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com