如何在PostgreSQL中自动递增列?例如,在该递增数字后添加一些固定文本。

3

我刚接触Postgres,正在尝试创建模式。 我的需求是需要自动递增表中的ID列,但我不想只是一个数字,我希望它是一个固定值后跟着递增的数字。 例如 -

DAG100H001
DAG100H002
DAG100H003
DAG100H004

有点像这样。我在查看文档时发现了“serial”但是不确定如何使用它实现。 任何帮助将不胜感激。谢谢。


2
这看起来像是一个复合键,你找不到一个好的解决方案的原因是因为这样做并不是真正推荐的。相反,将键拆分为其组成部分并单独存储它们,这样它将成为一个简单的数值字段,只需要递增即可。 - Lasse V. Karlsen
1
Lasse是正确的。在一个integer列中存储一个递增的值,在一个varchar列中存储前缀,当您在应用程序中_display_该数字时,连接和格式化数字。 - user330315
如果我们想要从同一张表中选择另一个字段,应该使用什么代替“DAG100H”? - Suhail Abdul Rehman Chougule
1个回答

2
使用序列和前缀:
CREATE SEQUENCE seq INCREMENT BY 1;

如何使用它:
SELECT 
  'DAG100H'||lpad(nextval('seq')::text,3,'0'),
  'DAG100H'||lpad(nextval('seq')::text,3,'0');

  ?column?  |  ?column?  
------------+------------
 DAG100H001 | DAG100H002
(1 row)

你可能想直接将它添加到你的表格中:
CREATE TABLE t (
  id text DEFAULT 'DAG100H'||lpad(nextval('seq')::text,3,'0'), 
txt text);

这样你就可以插入值了...

INSERT INTO t (txt) VALUES ('foo'),('bar');

..并且它们会获取你想要的ID

SELECT * FROM t;

     id     | txt 
------------+-----
 DAG100H001 | foo
 DAG100H002 | bar
(2 rows)

请注意您问题的评论部分,因为它们提出了一个很好的观点!考虑使用普通数字序列,并通过将其与列连接起来添加前缀到客户端: 'DAG100H'||lpad(nextval('seq')::text,3,'0'), ..

1
我怀疑OP想要第十个是'DAG100H010'而不是'DAG100H0010' - Gordon Linoff
@GordonLinoff 你说得对。谢谢指出。我刚刚用 lpad 更正了我的答案。 - Jim Jones

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接