如何将新项目附加到 PostgreSQL 中的数组类型列中

Posted

技术标签:

【中文标题】如何将新项目附加到 PostgreSQL 中的数组类型列中【英文标题】:How to append a new item into the array-type column in PostgreSQL 【发布时间】:2015-03-28 16:46:18 【问题描述】:

我在我的应用程序中使用 PostgreSQL,

任务会是这样的

有些用户在使用我的应用,我需要根据他们的活动为每个用户维护通知,以便为每个用户收到大量通知。

所以一般来说,我们只是将所有通知放在一个单独的表中,并使用用户 ID 进行映射,所以我们可以获取它们,但现在我想使用 json/array 数据类型,所以我可以把整个通知设置为 array/json 到每个用户行的单元格中。

哪个更好,存储json还是数组?(我在服务器端使用php

如果我们选择两者中的任何一个,假设我们有大约 10 个通知,而我得到了第 11 个,我们如何在单次执行中将新项目附加到数组/json 对象中(可能是 UPDATE 语句) ? 我不想以基本的方式选择行,获取现有的数组/json,最后添加新项目(使用 PHP 处理)并更新它 - 这里需要两次执行,可能会发生另一个变化,这会带来数据丢失

那么有没有办法进行 UPDATE 查询,只添加一个新元素或更改 PostgreSQL 中 array/json 对象类型中的现有元素/节点?

【问题讨论】:

【参考方案1】:

要将项目附加到 PostgreSQL 中的数组,您可以使用 || 运算符或 array_append 函数。

与 ||运营商

UPDATE table SET array_field = array_field || '"new item"' WHERE ...

带有array_append函数

UPDATE table SET array_field = array_append(array_field,'new item') WHERE ...

另外,您可以访问此页面以获取数组,http://www.postgresql.org/docs/current/interactive/functions-array.html

我不知道如何使用 JSON 数据类型。

【讨论】:

如果你想使用键值对,hstore 数据类型可能更适合你。 这适用于 jsonb(我相信也适用于 json)update table set array_field = array_field || '"a":"b"'::jsonb 未来读者请注意:上述@sscarduzio 的解决方案有效(适用于 json/jsonb),但需要注意的是,所讨论的列必须是数据类型 JSON/JSONB。如果列的数据类型已设置为数组(例如 int[] 或 text []),它将不起作用。因此,将新列添加为 json(b) 类型,并使用此答案中概述的命令和上面的评论。

以上是关于如何将新项目附加到 PostgreSQL 中的数组类型列中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用钩子将项目附加到 React 组件中的数组?

PostgreSQL:仅当元素唯一时才将元素附加到 jsonb 数组

使用 postgres 9.4 将 JSON 元素附加到数组

将项目附加到 PyMongo 中的 MongoDB 文档数组而不重新插入

如何将 PostgreSQL 卷附加到使用 SBT 本机打包程序生成的 Docker 映像?

获取嵌套数组项以附加到 HTML 表中的新列