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

How to set unique constraint on nested JSON with multiple columns

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

示例行如下所示:

{ name: 'someName',
  a: {
    b: {
      c: 'some text'
    }
  }
}

为此创建 table 的 postgres 命令是什么?目前我有这个,它在 (.

附近给出语法错误

创建 TABLE 操作 ( id bigint 不为空, 名称文本, 一个json, unique (name, payload::json#>>'{message, payload, content}') );

我也试过了

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 in CREATE TABLE 只接受列名

所以如果你想在一个表达式上建立索引,你必须在 table 创建之后添加它,命令是 CREATE INDEX (alter table 无法实现)

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 ) }