2012-05-24 2 views
2

Я использую Postgres 9.1 и хотел бы создать последовательность, которую я могу использовать в качестве первичного ключа, и который должен выглядеть следующим образом:Создание последовательности, значения которых представляют собой сочетание символов и чисел

| entity_id_seq | 
----------------- 
|   X0001 | 
|   X0002 | 
      .... 
|   X| 

и nextval('entity_id_seq') вернется 'X0124'.

Любая идея, как и если это возможно с чистыми Postgres?

Большое спасибо!

+0

Хотите ли вы использовать его в определении столбца для автоматически увеличивающегося ключа? Вы хотите, чтобы он всегда напоминал «X [0-9] {4}»? –

+0

@SzymonGuz Ответы на оба вопроса да :-) – Beasterfield

ответ

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 
); 
2

Мы могли бы сделать функцию, которая использовала бы nextval и добавила бы X к ней. Что-то вроде этого:

CREATE FUNCTION nextseq() RETURNS text 
AS 
begin 
return 'X'||lpad(nextval('entity_id_seq',4,'0'); 
end; 
Смежные вопросы