postgresql Postgres更新Query for Array列

cnwbcb6i  于 5个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(56)

这是如此简单的查询.我需要更新预订表',LinkedBookings列(int数组数据类型),它自己的ID.下面的查询没有为我工作.

update public."Booking" b set "LinkedBookings" = {"Id"}

字符串
上面是给下面的错误,

SQL Error [42601]: ERROR: syntax error at or near "{"


我搜索了整个互联网和postgres文档,找不到任何合适的简单查询。我可以理解有一种方法可以写一个Pg函数。而不是做这么大的事情,没有任何简单的查询吗?

w1e3prcc

w1e3prcc1#

假设LinkedBookings是一个数组列,并假设您希望将其设置为仅包含每行的Id的数组,则正确的SQL应该是>>

UPDATE public."Booking" b 
    SET "LinkedBookings" = ARRAY[b."Id"];

字符串

v1l68za4

v1l68za42#

你要找的医生来了。
你使用的语法是用于字面量的--你得到错误是因为你缺少了方括号周围的单引号,整个东西应该是一个text,然后才能成为一个int[]数组。Demo at db<>fiddle:

update public."Booking" b set "LinkedBookings" = ('{'||"Id"::text||'}')::int[]
  returning *,pg_typeof("LinkedBookings");

字符串
| ID|联系我们|pg_typeof|
| --|--|--|
| 1 |{1}下一页|integer[]|
| 2 |{1}、{2}| integer[]|
| 3 |{1}第三节|integer[]|
另一种语法是将值 Package 在ARRAY[]中,已经指出了。您可以添加显式转换以确保:

update public."Booking" b set "LinkedBookings" = (ARRAY["Id"])::int[];


如果您只是以另一种形式提供"Id",以在其他地方保存数组 Package ,则可以考虑将"LinkedBookings"设置为generated column--这样就不需要定期刷新update表。

alter table public."Booking" drop column if exists "LinkedBookings";
alter table public."Booking" add column "LinkedBookings" int[] 
   generated always as ((ARRAY["Id"])::int[]) stored;
--no update necessary
select *,pg_typeof("LinkedBookings") from public."Booking";


| ID|联系我们|pg_typeof|
| --|--|--|
| 1 |{1}下一页|integer[]|
| 2 |{1}、{2}| integer[]|
| 3 |{1}第三节|integer[]|
如果您正在运行此更新以预填充列,并且您计划稍后修改它,请不要将其设置为generated,因为这些列不能直接修改。它们只能通过修改它们所依赖的值来重新生成。

相关问题