创建一个值为字符和数字混合的序列

时间:2012-05-24 11:24:46

标签: postgresql

我正在使用Postgres 9.1,并希望创建一个我可以用作主键的序列,它应该如下所示:

| entity_id_seq |
-----------------
|         X0001 |
|         X0002 |
           ....
|         X0123 |

nextval( 'entity_id_seq' )将返回'X0124'

任何想法是如何以及如果纯粹的Postgres可以实现这一点?

非常感谢!

2 个答案:

答案 0 :(得分:7)

这样的事应该没问题:

创建序列:

CREATE SEQUENCE special_seq;

是否创建一个函数:

CREATE OR REPLACE FUNCTION
nextval_special()
RETURNS TEXT
LANGUAGE sql
AS
$$
    SELECT 'X'||to_char(nextval('special_seq'), 'FM0000'); 
$$;

现在检查它是否有效:

SELECT nextval_special() FROM generate_series(1,10);

 nextval_special 
-----------------
 X0001
 X0002
 X0003
 X0004
 X0005
 X0006
 X0007
 X0008
 X0009
 X0010
(10 rows)

现在您可以使用上述功能创建表格:

CREATE TABLE test (
    id TEXT PRIMARY KEY DEFAULT nextval_special(),
    a int
);

或者只是没有来自函数的简单查询的函数:

CREATE TABLE test (
    id TEXT PRIMARY KEY DEFAULT 'X'||to_char(nextval('special_seq'), 'FM0000'),
    a int
);

答案 1 :(得分:2)

我们可以创建一个能够使用nextval并将X前置的函数。像这样:

CREATE FUNCTION nextseq() RETURNS text
AS 
begin 
return 'X'||lpad(nextval( 'entity_id_seq',4,'0' );
end;