如何将新项目附加到 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 中的数组类型列中的主要内容,如果未能解决你的问题,请参考以下文章
PostgreSQL:仅当元素唯一时才将元素附加到 jsonb 数组
使用 postgres 9.4 将 JSON 元素附加到数组
将项目附加到 PyMongo 中的 MongoDB 文档数组而不重新插入