3

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

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

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

任何想法如何以及是否可以使用纯 Postgres?

非常感谢!

4

2 回答 2

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
);
于 2012-05-24T11:46:17.203 回答
2

我们可以创建一个函数来使用 nextval 并在其前面加上 X。像这样的东西:

CREATE FUNCTION nextseq() RETURNS text
AS 
begin 
return 'X'||lpad(nextval( 'entity_id_seq',4,'0' );
end;
于 2012-05-24T11:40:33.663 回答