如何在PostgreSQL中自动递增字母数字值?

10

我正在使用 "PostgreSQL 9.3.5"

我有一个名为 StackOverflowTable表格,其中包含 (SoId, SoName, SoDob)

我想要为列 SoId 创建一个 序列生成器,它是一个字母数字值。

我想要在PostgreSQL中自动递增一个字母数字值。

For eg : SO10001, SO10002, SO10003.....SO99999.

编辑:

如果明天我需要生成一个序列,可以是 SO1000E100, SO1000E101,... 并且具有良好的性能。那么什么是最佳解决方案!


1
如果所有的值都始终具有前缀“S0”,那么我将不会生成该值。我宁愿使用一个serial列和一个视图来格式化生成的(数字)ID,以您想要的方式。这样需要更少的空间和开销来生成数字。 - user330315
3个回答

9

使用序列和默认值来创建id:

postgres=# CREATE SEQUENCE xxx;
CREATE SEQUENCE
postgres=# SELECT setval('xxx', 10000);
 setval 
--------
  10000
(1 row)

postgres=# CREATE TABLE foo(id text PRIMARY KEY 
                                    CHECK (id ~ '^SO[0-9]+$' ) 
                                    DEFAULT 'SO'  || nextval('xxx'), 
                            b integer);
CREATE TABLE
postgres=# insert into foo(b) values(10);
INSERT 0 1
postgres=# insert into foo(b) values(20); 
INSERT 0 1
postgres=# SELECT * FROM foo;
   id    | b  
---------+----
 SO10001 | 10
 SO10002 | 20
(2 rows)

谢谢您的回复 :) - 09Q71AO534
使用 START [ WITH ] 10000 可能比单独使用 setval('xxx', 10000) 更简单。 - Ihor Romanchenko

7
您可以将列的默认值定义为以下内容:将S和一个普通的序列连在一起。
CREATE SEQUENCE sequence_for_alpha_numeric
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 1
  CACHE 1;


CREATE TABLE table1
(
  alpha_num_auto_increment_col character varying NOT NULL,
  sample_data_col character varying,
  CONSTRAINT table1_pkey PRIMARY KEY (alpha_num_auto_increment_col)
)
;

ALTER TABLE table1 ALTER COLUMN alpha_num_auto_increment_col SET DEFAULT TO_CHAR(nextval('sequence_for_alpha_numeric'::regclass),'"S"fm000000');

测试:

                          ^
insert into table1 (sample_data_col) values ('test1');
insert into table1 (sample_data_col) values ('test2');
insert into table1 (sample_data_col) values ('test3');

select * from table1;
 alpha_num_auto_increment_col | sample_data_col
------------------------------+-----------------
 S000001                      | test1
 S000002                      | test2
 S000003                      | test3
(3 lignes)

如何使用 sequences

如何使用to_char函数。


感谢您的回复:)作为FIFO,我已经投票支持Pavel Stehule的答案。 - 09Q71AO534

0

创建如下序列:

 CREATE SEQUENCE seq_autoid
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 9223372036854775807
  START 10000

创建一个函数来生成字母数字ID。
create or replace function auto_id () returns varchar as $$
select 'SO'||nextval('seq_autoid')
$$ language sql 

并尝试这个示例表格

create table AAA(id text ,namez text)

insert into AAA values (auto_id(),'MyName')
insert into AAA values (auto_id(),'MyName1')
insert into AAA values (auto_id(),'MyName2')

感谢您的回复:)作为FIFO,我已经投票支持Pavel Stehule的答案。 - 09Q71AO534

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