#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
помощью .