sequence
Это аналог автоинкремента из MySQL. Его можно использовать, когда требуется уникальный идентификатор. Например, в
простых таблицах в качестве PRIMARY KEY
Некоторые особенности:
- Можно указать начальное значение с которого будет вестись отсчёт
- Можно задать шаг с которым будут генерироваться новые значения
- В качестве шага можно указывать отрицательные значения (тогда последовательность будет убывающей)
- sequence не обязан быть привязан к таблице, но может быть связан с колонкой (например, через OWNED BY или при
использовании
serial. Т.е. один sequence можно использовать даже в нескольких таблицах - Если две транзакции одновременно запросят значение одного sequence, то они получат разные значения
- Значения sequence не откатываются при
rollbackтранзакции — если число выдано, оно считается использованным. - Если в таблицу где в качестве значения одного из столбцов используется sequence, вставить значение вручную, то
последовательность автоматически не "перещёлкнется" и в следующий раз отдаст значение которое уже есть в
таблице. Это может вызвать ошибки, есть на столбце есть
UNIQUE - При использовании sequence не гарантируется непрерывность, т.е. значения могут быть пропущены
- У sequence есть границы
MINVALUEиMAXVALUEпри их достижении если указаноNO CYCLE— будет ошибка, еслиCYCLE— значения начнут повторяться. CYCLE нельзя использовать для генерации уникальных идентификаторов.
Запросы:
CREATE SEQUENCE table_name_id_seq
START WITH 1000 -- начать с 1000 (если не указать будет начинаться с 1)
INCREMENT BY 10 -- шаг 10 (если не указать будет равен 1)
NO CYCLE; -- когда дойдёт до максимального значения выдаст ошибку, иначе начнётся с начала (NO CYCLE по умолчанию)
SELECT setval('table_name_id_seq', 5000); -- установить текущее значение sequence
SELECT nextval('table_name_id_seq'); -- получить следующее значение sequence напрямую
CREATE TABLE table_name (
id int DEFAULT nextval('table_name_id_seq') PRIMARY KEY -- DEFAULT nextval('table_name_id_seq') означает что
-- по умолчанию будет использовано значение из sequence
);
SELECT * FROM table_name_id_seq; -- посмотреть текущее значение sequence