Working with Sequences

1. Creating Sequence

CREATE SEQUENCE order_seq
   START 1000 INCREMENT 1 MINVALUE 1 MAXVALUE 9223372036854775807
   CACHE 50 OWNED BY orders.id;
ClausePurpose
START / INCREMENTInitial / step
MINVALUE / MAXVALUEBounds
CACHE nPreallocate per backend
CYCLERestart on wraparound
OWNED BYAuto-drop with column

2. Using nextval Function

SELECT nextval('order_seq');
Note: nextval is transaction-safe but values may be skipped on rollback (gaps allowed).

3. Using currval Function

SELECT currval('order_seq');   -- last value generated in THIS session

4. Using lastval Function

INSERT INTO orders DEFAULT VALUES;
SELECT lastval();    -- last sequence touched in this session

5. Using setval Function

SELECT setval('order_seq', 1000);          -- next = 1001
SELECT setval('order_seq', 1000, false);   -- next = 1000

6. Creating Auto-Increment Columns

CREATE TABLE notes (
   id   bigserial PRIMARY KEY,        -- legacy
   note text
);

7. Using GENERATED ALWAYS AS IDENTITY

CREATE TABLE orders (
   id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
   ...
);
-- Insert: must use OVERRIDING SYSTEM VALUE to supply explicit id

8. Using GENERATED BY DEFAULT AS IDENTITY

CREATE TABLE messages (
   id bigint GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
   body text
);
-- Explicit id allowed; sequence used when omitted
ModeUser Value
ALWAYSRequires OVERRIDING SYSTEM VALUE
BY DEFAULTAllowed

9. Altering Sequence

ALTER SEQUENCE order_seq INCREMENT 10 RESTART WITH 5000 CACHE 100;
ALTER TABLE orders ALTER COLUMN id SET GENERATED BY DEFAULT;

10. Resetting Sequence

SELECT setval(pg_get_serial_sequence('orders','id'),
              (SELECT COALESCE(max(id),0) FROM orders));

11. Setting Sequence Ownership

ALTER SEQUENCE order_seq OWNED BY orders.id;     -- auto-drop with column
ALTER SEQUENCE order_seq OWNED BY NONE;

12. Listing Sequences

\ds
SELECT sequencename, last_value, increment_by
  FROM pg_sequences WHERE schemaname='public';

13. Dropping Sequence

DROP SEQUENCE IF EXISTS order_seq CASCADE;