代码之家  ›  专栏  ›  技术社区  ›  weeraa

Postgres更新查询数组列

  •  0
  • weeraa  · 技术社区  · 2 年前

    这是一个如此简单的查询。我需要将Bookings tables的,LinkedBookings列(int数组数据类型)更新为它自己的Id。下面的查询对我不起作用。

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

    以上给出以下误差,

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

    我在互联网和postgres文档中搜索,找不到任何合适的简单查询。我能理解有一种方法可以用来编写Pg函数。与其做这么大的事情,难道没有任何简单的质疑吗?

    2 回复  |  直到 2 年前
        1
  •  3
  •   TSCAmerica.com    2 年前

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

       UPDATE public."Booking" b 
        SET "LinkedBookings" = ARRAY[b."Id"];
    
        2
  •  0
  •   Zegarek    2 年前

    Here's the the doc you were looking for .

    您使用的语法是用于文字的——您之所以出现错误,是因为您缺少括号周围的单引号,而整个内容应该是 text 在它变成 int[] 大堆 Demo at db<>fiddle:

    update public."Booking" b set "LinkedBookings" = ('{'||"Id"::text||'}')::int[]
      returning *,pg_typeof("LinkedBookings");
    
    身份证件 链接预订 第页类型
    1. {1} 整数[]
    2. {2} 整数[]
    3. {3} 整数[]

    另一种语法是将值包装在中 ARRAY[] ,已经指出。您可以添加显式强制转换以确保:

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

    如果你只是 "Id" 以其他形式提供,可以在其他地方保存数组包装,可以考虑设置 "LinkedBookings" 作为一个 generated column -这样你就不需要不断地用periodical刷新表格 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";
    
    身份证件 链接预订 第页类型
    1. {1} 整数[]
    2. {2} 整数[]
    3. {3} 整数[]

    如果您正在运行此更新以预填充列,并且计划稍后对其进行修改,请不要进行 generated 因为这些不能直接修改。它们只能通过修改它们所依赖的值来重新生成。