如何对多列嵌套 JSON 设置唯一约束

wri*_*mus 2 sql postgresql unique-constraint

我试图在两列(namea)之间设置唯一约束,一列为 type text,另一列为 type json。我如何在 Postgres 9.6.3 中构建它?

示例行如下所示:

{ name: 'someName',
  a: {
    b: {
      c: 'some text'
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

为此创建表的 postgres 命令是什么?目前我有这个,它在 附近给出了语法错误(

创建表操作(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);
Run Code Online (Sandbox Code Playgroud)

这一直给我这个错误:

ERROR:  syntax error at or near "::"
Run Code Online (Sandbox Code Playgroud)

我怎样才能创建这个约束?

csk*_*ske 5

如果您检查文档创建表

table_constraint 是:

[约束约束名]

UNIQUE ( 列名 [, ... ] )

UNIQUEinCREATE TABLE只接受列名

因此,如果您想要在表达式上建立索引,则必须在创建表后添加它,命令是CREATE INDEX(无法通过 alter table 完成)

create unique INDEX actions_constraint on action (((a#>>'{b, c}')::text), name);  
Run Code Online (Sandbox Code Playgroud)

CREATE [唯一]索引[同时][[如果不存在]名称]ON表名[使用方法]({列名|(表达式)}