【问题标题】:PostgreSQL getting new id during insertPostgreSQL 在插入期间获取新 id
【发布时间】:2018-11-14 18:59:02
【问题描述】:

我需要在记录插入时创建一些客户编号,格式为“A”+ 4 位,基于 ID。所以记录 ID 23 -> A0023 等等。我目前的解决方案是这样的:

-- Table
create table t (
  id bigserial unique primary key,
  x text,
  y text
);

-- Insert
insert into t (x, y) select concat('A',lpad((currval(pg_get_serial_sequence('t','id')) + 1)::text, 4, '0')), 'test';

这非常有效。现在我的问题是......这是“安全”的,因为 currval(seq)+1 保证与 id 列将接收到的相同?我认为它应该在语句执行期间被锁定。这是正确的方法还是有任何快捷方式可以直接访问要创建的ID?

【问题讨论】:

    标签: postgresql currval


    【解决方案1】:

    您可以在每次需要时查询它,而不是存储这些数据,从而使整个事情更不容易出错:

    SELECT id, 'A' + LPAD(id::varchar, 4, '0')
    FROM   t
    

    【讨论】:

    • 嗯...是的。但实际上,为了说明,这个例子有点简化,在实践中,客户 ID 的前缀不是恒定的“A”,所以我真的想把它存储起来。
    • @Flo 这听起来有点像 XY 问题。您能否简化问题以包含更多“肉”?
    • 当然。前缀实际上来自外部输入(因此实际插入 SQL 是动态创建的)。实际上,它在这里并没有真正发挥作用,因为实际的问题是该序列号 + 1 是否真的提供与 ID 完全相同的(=并行插入会造成任何麻烦;我不认为它可以但不确定)。当然,我可以将前缀存储在一个列中,然后动态添加前缀和 LPAD(),但我想避免这种情况,因为它将在多个查询中使用。也许使用程序?嗯,工作,但真的更喜欢一个简单的领域。
    猜你喜欢
    • 2011-04-20
    • 2020-09-10
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2018-03-08
    • 1970-01-01
    • 2014-10-05
    相关资源
    最近更新 更多