是否可以将外键分配给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
);
答案 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)
);