【问题标题】:(Closed) Postgresql or Python: How I can loop table records and create sequence number?(关闭)Postgresql 或 Python:如何循环表记录并创建序列号?
【发布时间】:2023-02-11 02:41:05
【问题描述】:

我有一项关于在现有记录上创建序列号的任务。该表已经创建并有大量记录,我创建了一个新字段作为“UniqueId”。

让我们看看下面的表格:-

FieldA   FieldB  UniqueId
Zack     928334  
Yassir   829384  
Yassir   829384  
Zack     928334  
Zack     928334  
Richard  723346  

我需要的是 PostgreSQL 或 Python 可以在第一条记录上创建一个以“0501”开头的数字,如果同一条记录找到一个新数字但序列将是“0502”等等。

FieldA   FieldB  UniqueId
Zack     928334  0501
Yassir   829384  0501
Yassir   829384  0502
Zack     928334  0502
Zack     928334  0503
Richard  723346  0501

我对这个问题仍然没有任何想法,希望那些已经遇到这个问题的人可以帮助我解决它。

我立即非常感谢你。

谢谢。

【问题讨论】:

  • 也许this,虽然我不知道是否可以提供前导零。
  • 谢谢@snakecharmerb,让我先试试你的建议。也许可以解决我的问题。 ):

标签: python sql postgresql


【解决方案1】:

您可以通过相对简单的触发器获得您想要的东西。 (见demo)

create or replace function gen_unique_id()
  returns trigger 
 language plpgsql
as $$
begin 
    select coalesce( max(uniqueid)+1, 501)  
      into new.uniqueid
      from test 
     where fielda = new.fielda
       and fieldb = new.fieldb; 
   
    return new;
end; 
$$;

create trigger unique_id_biur
        before insert or update
            on test
          for each row
           execute function gen_unique_id();

警告:

  1. 这是max+1的赋值。在多用户环境中几乎可以保证在某个时刻生成一个副本。您需要处理它启用的竞争条件。
  2. 您需要弄清楚当fielda 或fieldb 更新为一组不存在的值或旧值之间存在间隙时会发生什么。还有删除一行时会发生什么。

    并且可能会有其他后果。

【讨论】:

  • 你好@Belayer,谢谢你的回答。我不熟悉 PostgreSQL 上的函数和触发器。我如何从我的烧瓶 python 中调用这个东西?我需要先在 PostgreSQL 服务器上创建它吗?
  • 您不调用触发器。您只需编写触发器函数并在服务器上定义触发器。当发布适当的 DML(插入、更新、删除)时,会自动调用该函数。请参阅 Trigger Functions 和 Create Trigger 的文档。
  • 好的。让我先试试然后我会更新结果
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 2016-03-10
  • 2023-03-11
  • 1970-01-01
  • 2019-12-20
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多