为多个表连续编号行

art*_*hur 1 postgresql scripting window-functions update

我有许多表,都包含属性aid,bid,cidxid整数类型,其他属性可能不同。对于每个(给定)表T,我想根据aid,bid,cid升序和更新列对行进行排序xid,增量值从 0 开始。实现这一目标的最佳方法是什么?

我目前的解决方案包括:

  • 选择表 T
  • 在表的有序元组上打开游标
  • 将自动增量值分配给 xid
  • 将元组插入时态表 T_temp
  • 删除所有记录 T
  • 将所有记录插入T_tempT

由于这些表具有不同的模式,我编写了一半代码PL/pgSQL,一半代码使用 bash 脚本编写。

问题 1:任何评论如何让它在纯 PL/pgSQL 中编程?

问题 2:任何评论如何更优雅地实现?

Erw*_*ter 6

如果我理解正确,您想为每个表重新开始编号为 0。
使用窗函数row_number()UPDATE

UPDATE tbl t
SET    xid = n.xid
FROM  (SELECT ctid, row_number() OVER (ORDER BY aid, bid, cid) - 1 AS xid FROM tbl) n
WHERE  t.ctid = n.ctid;
Run Code Online (Sandbox Code Playgroud)

ctid作主键的可怜人的代理,因为您忽略了公开您的表定义。

SQL小提琴。
db<>在这里摆弄

  • 穷人的代理键的额外(尽管是虚构的)+1 :) (4认同)