Как автоматически увеличить столбец в postgres? Как какой-то фиксированный текст после этого увеличивающегося числа

#sql #postgresql

Вопрос:

Я новичок в postgres и пытаюсь создать схему. У меня есть требование, в котором мне нужно автоматически увеличить столбец идентификатора моей таблицы. Но я не хочу, чтобы это было просто число, а какое-то фиксированное значение, за которым следует увеличивающееся число. Пример —

 DAG100H001
DAG100H002
DAG100H003
DAG100H004
 

что-то вроде этого. Я просматривал документацию и нашел серийный номер, но я не уверен, как его реализовать с помощью этого.
Любая помощь будет признательна. Спасибо.

Комментарии:

1. Это похоже на составной ключ, причина, по которой у вас возникают проблемы с поиском хорошего решения для того, как с ним справиться, заключается в том, что на самом деле не рекомендуется делать это так. Вместо этого разделите ключ на составные части и сохраните их отдельно, таким образом, это будет простое числовое поле, которое нужно будет увеличить.

2. Лассе прав. Сохраните увеличивающееся значение в integer столбце, сохраните префикс в varchar столбце и объедините и отформатируйте число при его отображении в приложении.

Ответ №1:

Используйте последовательность и префикс:

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

.. и они получат удостоверение личности, которое вы хотите

 SELECT * FROM t;

     id     | txt 
------------ -----
 DAG100H001 | foo
 DAG100H002 | bar
(2 rows)
 
  • Обратите внимание на раздел комментариев к вашему вопросу, так как они очень хорошо подчеркивают! Рассмотрите возможность использования обычной числовой последовательности и просто добавьте префикс клиенту, объединив его со столбцом: 'DAG100H'||lpad(nextval('seq')::text,3,'0'), ..

Комментарии:

1. Я подозреваю, что ОПЕРАЦИЯ хочет, чтобы десятый был 'DAG100H010' , а не 'DAG100H0010' .

2. @ГордонЛинофф, ты прав.. спасибо, что указали. Я просто исправил свой ответ с lpad помощью .