【问题标题】:Postgres Jsonb datatypePostgres Jsonb 数据类型
【发布时间】: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


【解决方案1】:

你可以使用jsonb_typeof(data -&gt; 'CountActualCharacters') = 'string'

注意单箭头,因为-&gt;&gt; 会尝试将任何内容转换为字符串。

您可以在此处阅读有关 PostgreSQL 中 JSON 函数的更多信息: https://www.postgresql.org/docs/current/static/functions-json.html

【讨论】:

  • 感谢 alexey,但在那篇文章中没有提到 varchar,如果我使用字符串,那么 json 中也包含空格和空格将通过验证。我需要这个“thu45io89”来验证不是“ths 097 ndkn lp”。 :)
  • 您将 JSON 类型与 DB 类型混淆了。它们不一样。不接受空格是你的业务逻辑,而不是类型会验证的东西。
  • @Ankur:您应该编辑您的问题并添加您当前在 Oracle 中使用的检查约束
猜你喜欢
  • 2020-07-01
  • 2019-08-03
  • 2017-02-11
  • 2018-05-31
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 2019-05-20
相关资源
最近更新 更多