PostgreSQL中的JSON外键

时间:2014-06-30 11:59:03

标签: postgresql

是否可以将外键分配给PostgreSQL中的json属性?这是我想要实现的一个例子,但它不起作用:

CREATE TABLE Users (Id int NOT NULL PRIMARY KEY);

CREATE TABLE Data (
    Id int NOT NULL PRIMARY KEY,
    JsonData json NOT NULL, -- [{Id: 1, somedata: null},{Id: 2, somedata: null}, ...]
    CONSTRAINT FK_Users_Data FOREIGN KEY (JsonData->Id) REFERENCES Users(Id) -- this constraint will fail
);

3 个答案:

答案 0 :(得分:13)

将外键分配给json属性是不可能的,也是不可能的。对PostgreSQL的外键执行来说,这是一个重大且相当复杂的变化。我认为这是不可能做到的,但是会遇到与外键到阵列补丁所遇到的问题类似的问题。

使用9.4,可以使整个json对象成为外键,因为jsonb支持相等测试。在9.3中,你甚至不能这样做。

答案 1 :(得分:6)

这里有一个小函数have_ids,它用于与jsonb列的一对多关系的完整性约束

CREATE TABLE foo (
  id INTEGER NOT NULL
)

CREATE TABLE bar (
  foo_ids pg_catalog.jsonb DEFAULT '[]'::jsonb NOT NULL,
  CONSTRAINT bar_fooids_chk CHECK (have_ids ('foo', foo_ids))
)

foo上有几个触发器,它几乎和外键一样好。

答案 2 :(得分:2)

外键参数必须是列名:

http://www.postgresql.org/docs/current/static/sql-createtable.html

您必须标准化

create table user_data (
    id int not null primary key,
    user_id int not null,
    somedata text,
    constraint fk_users_data foreign key (user_id) references Users(Id)
);