【发布时间】:2018-08-29 16:34:41
【问题描述】:
我正在使用 PostgreSQL 根据提供给我的 Java 代码的 json 输入创建一个表,我需要对在数据库上传递的 JSON 键进行验证,就像 oracle 一样,但这里的问题是整个 jsonb 数据类型列名让我们说 data 是单列。考虑我得到以下格式的 json -
{
"CountActual": 1234,
"CountActualCharacters": "thisreallyworks!"
"Date": 09-11-2001
}
上述json的正确数据类型:-number(10),varchar(50),date
现在对我正在使用的约束进行验证
查询 1 -
ALTER TABLE public."Detail"
ADD CONSTRAINT "CountActual"
CHECK ((data ->> 'CountActual')::bigint >=0 AND length(data ->> 'CountActual') <= 10);
--工作正常。
但对于 查询 2-
ALTER TABLE public."Detail"
ADD CONSTRAINT "CountActualCharacters"
CHECK ((data ->> 'CountActualCharacters')::varchar >=0 AND length(data ->> 'CountActualCharacters') <= 50);
我遇到了错误 -
[ERROR: operator does not exist: character varying >= integer
HINT: No operator matches the given name and argument type(s).
You might need to add explicit type casts.]
我尝试了另一种方式,也喜欢 -
ALTER TABLE public."Detail"
ADD CONSTRAINT CountActualCharacters CHECK (length(data ->> 'CountActualCharacters'::VARCHAR)<=50)
上述约束成功,但我认为这不是正确的方法,因为我的验证在插入数据时不起作用 -
Insert into public."Detail" values ('{"
CountActual":1234,
"CountActualCharacters":789
"Date": 11-11-2009
}');
当在 CountActualCharacters 中传入 789 而不是像“the78isgood!”这样的 varchar 时,它的节目插入成功。
所以请任何人建议我对varchar 的 PostgreSQL 进行适当的约束,就像我在查询 1 中编写的 number 一样。
如果可能的话,日期类型也可以使用DD-MM-YYYY 格式。
我刚开始使用 PostgresSQL,如果我听起来很傻,请原谅我,但我真的被困在这里了。
【问题讨论】:
-
“就像 Oracle”是什么意思? Oracle 只能验证 JSON 在结构上是否有效,仅此而已。
-
听起来像unnecessary JSON 的情况。如果您确实需要数据 type 验证,请使用具有正确数据类型的常规列。
-
那是我的错。现在,我需要验证输入 json 的内容。
-
整个json数据在单列buddy....
-
您的检查约束验证可以为键
CountActualCharacters存储不超过 50 个字符,就像varchar(50)一样。为什么存储像789这样的3个字符时会失败?
标签: sql postgresql jsonb