PostgreSQL 是否提供任何符号/方法来对JSON 数组的每个元素施加约束?
一个例子:
create table orders(data json);
insert into orders values ('
{
"order_id": 45,
"products": [
{
"product_id": 1,
"name": "Book"
},
{
"product_id": 2,
"name": "Painting"
}
]
}
');
我可以轻松地在字段上添加约束order_id
:
alter table orders add check ((data->>'order_id')::integer >= 1);
现在我需要对product_id
. 我可以对单个数组项施加约束:
alter table orders add check ((data->'products'->0->>'product_id')::integer >= 1);
alter table orders add check ((data->'products'->1->>'product_id')::integer >= 1);
-- etc.
所以很明显我正在寻找的是某种用于匹配任何 JSON 数组元素的通配符运算符:
alter table orders add check ((data->'products'->*->>'product_id')::integer >= 1);
-- ^ like this
我知道这可以通过将产品提取到products
具有外键的单独表中来完成orders
。但我想知道这是否可以在单个 JSON 列中实现,因此在设计数据库模式时可以牢记这一点。