通过使用检查约束将JSON列限制为特定对象
我们使用的是Oracle 12.2,表结构如下:通过使用检查约束将JSON列限制为特定对象,json,oracle,oracle12c,Json,Oracle,Oracle12c,我们使用的是Oracle 12.2,表结构如下: create table myData ( id number, json_data varchar2(4000), CONSTRAINT checkJson CHECK (json_data IS JSON STRICT WITH UNIQUE KEYS), CONSTRAINT checkJson_F1 CHECK (json_exists(json_data, '$.FIELD1')), CON
create table myData
(
id number,
json_data varchar2(4000),
CONSTRAINT checkJson CHECK (json_data IS JSON STRICT WITH UNIQUE KEYS),
CONSTRAINT checkJson_F1 CHECK (json_exists(json_data, '$.FIELD1')),
CONSTRAINT checkJson_F2 CHECK (json_exists(json_data, '$.FIELD2'))
);
我们使用约束(checkJson_F1、checkJson_F2)确保只有在字段1和字段2存在时才能进行插入/更新:
insert into myData(id, json_data) values(1, '{"FIELD1" : "abc", "FIELD2" : "def"}'); -- OK
insert into myData(id, json_data) values(2, '{"FIELD1" : "abc"}'); -- Error
是否有方法检查不存在的对象,例如,我想限制以下插入生成错误:
insert into myData(id, json_data) values(1, '{"FIELD1" : "abc", "FIELD2" : "def", "FIELD3" : "def"}');
换句话说:我需要一个检查约束,在这里我可以限制可以存储在JSON列中的对象。我的伪代码如下所示:
CONSTRAINT checkJson_FX CHECK (json_getObjects(json_data, '$.*') in ("FIELD1", "FIELD2"))
感谢您的回答,看起来.size()函数只适用于更高版本(例如19c)。在12.2中,当我调用这个函数时,我得到null:从dual中选择json_值('{“FIELD1”:“abc”,“FIELD2”:“def”}','$.size()');
create table myData (
id number,
json_data varchar2(4000),
CONSTRAINT checkJson CHECK (json_data IS JSON STRICT WITH UNIQUE KEYS),
CONSTRAINT checkJson_F1 CHECK (
json_exists(json_data, '$?(@.size() == 2 && exists(@.FIELD1) && exists(@.FIELD2))')
)
);