如何设置具有多列的嵌套JSON的唯一约束
问题描述:
我试图设置两列(name
和a
)之一,text
类型之一和json
类型之一之间的唯一约束。我如何在Postgres 9.6.3中构造这个?如何设置具有多列的嵌套JSON的唯一约束
一个例子行的样子:
{ name: 'someName',
a: {
b: {
c: 'some text'
}
}
}
什么是Postgres的命令来创建一个表吗?目前我有这个,它在(
附近给出了一个语法错误。
CREATE TABLE行动( ID BIGINT NOT NULL, 名文本, 一个JSON, 唯一(姓名,有效载荷:: JSON#>> '{消息,有效载荷,内容}') );
我也试过
CREATE TABLE action (
id bigint NOT NULL,
name text,
a json
);
ALTER TABLE actions ADD CONSTRAINT actions_constraint UNIQUE (payload::json#>>'{b, c, d}', name);
它不断给我这个错误:
ERROR: syntax error at or near "::"
如何创建这个约束?
答
如果选中文档create table
and table_constraint is:
[CONSTRAINT constraint_name ]
UNIQUE (column_name [, ... ]) index_parameters |
UNIQUE
在CREATE TABLE
只接受列名
所以,如果你想在一个表达式索引,您必须将其添加表创建后,该命令是CREATE INDEX
(不能通过改变表完成)
create unique INDEX actions_constraint on action (((a#>>'{b, c}')::text), name);
CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ [ IF NOT EXISTS ] name ] ON table_name [ USING method ] ({ column_name | (expression) }
谢谢,实际上我的工作是从'{a,b,c}'中删除'a'。因此,答案是“在行动上创建独特的INDEX actions_constraint(((a#>>'{b,c}'):: text),name); '。你能证实这一点,并改变它,所以我可以upvote你的答案? – writofmandamus
@writofmandamus如你所愿 – cske