CREATE SEQUENCE
The CREATE SEQUENCE statement creates a new sequence number generator.
Examples
Generate an ascending sequence starting from 1:
CREATE SEQUENCE serial;Generate sequence from a given start number:
CREATE SEQUENCE serial START 101;Generate odd numbers using INCREMENT BY:
CREATE SEQUENCE serial START WITH 1 INCREMENT BY 2;Descending sequences are not yet supported. A negative INCREMENT BY is rejected:
CREATE SEQUENCE serial START WITH 99 INCREMENT BY -1 MAXVALUE 99;error db error: ERROR: sequence INCREMENT must be positive \(negative increments not yet supported\)By default, cycles are not allowed. Once an ascending sequence reaches its MAXVALUE, the next call to nextval returns an error:
SELECT nextval('serial');db error: ERROR: nextval: reached maximum value of sequence "serial" (3)CYCLE allows cycling through the same sequence repeatedly. Once the limit is reached, the next value wraps back to the start:
SELECT nextval('serial') AS nextval; nextval--------- 1Creating and Dropping Sequences
Sequences can be created and dropped similarly to other catalog items.
Overwrite an existing sequence:
CREATE OR REPLACE SEQUENCE serial;Only create sequence if no such sequence exists yet:
CREATE SEQUENCE IF NOT EXISTS serial;Remove sequence:
DROP SEQUENCE serial;Remove sequence if exists:
DROP SEQUENCE IF EXISTS serial;Using Sequences for Primary Keys
Sequences can be used as DEFAULT values in CREATE TABLE statements.
The example below uses a sequence to create an integer primary key:
CREATE SEQUENCE id_sequence START 1;
CREATE TABLE tbl (id INTEGER PRIMARY KEY DEFAULT nextval('id_sequence'), s VARCHAR);
INSERT INTO tbl (s) VALUES ('hello'), ('world');
SELECT * FROM tbl; id | s----+------- 1 | hello 2 | worldYou can also add a sequence-backed column to an existing table with ALTER TABLE ... ADD COLUMN ... DEFAULT nextval(...). Existing rows are backfilled from the sequence and subsequent inserts continue from it:
ALTER TABLE tbl ADD COLUMN id INTEGER DEFAULT nextval('id_sequence');Selecting the Next Value
To select the next number from a sequence, use nextval:
CREATE SEQUENCE serial START 1;
SELECT nextval('serial') AS nextval; nextval--------- 1Using this sequence in an INSERT command:
INSERT INTO distributors VALUES (nextval('serial'), 'nothing');Selecting the Current Value
You may also view the current number from the sequence. Note that the nextval function must have already been called before calling currval, otherwise a Serialization Error (sequence is not yet defined in this session) will be thrown.
CREATE SEQUENCE serial START 1;
SELECT nextval('serial') AS nextval;
SELECT currval('serial') AS currval; nextval--------- 1
currval--------- 1Syntax
CREATE SEQUENCE creates a new sequence number generator.
If a schema name is given then the sequence is created in the specified schema. Otherwise it is created in the current schema. Temporary sequences exist in a special schema, so a schema name may not be given when creating a temporary sequence. The sequence name must be distinct from the name of any other sequence in the same schema.
After a sequence is created, you use the function nextval to operate on the sequence.
Parameters
| Name | Description |
|---|---|
CYCLE or NO CYCLE | The CYCLE option allows the sequence to wrap around when the maxvalue or minvalue has been reached by an ascending or descending sequence respectively. If the limit is reached, the next number generated will be the minvalue or maxvalue, respectively. If NO CYCLE is specified, any calls to nextval after the sequence has reached its maximum value will return an error. If neither CYCLE nor NO CYCLE are specified, NO CYCLE is the default. |
increment | The optional clause INCREMENT BY increment specifies which value is added to the current sequence value to create a new value. A positive value will make an ascending sequence, a negative one a descending sequence. The default value is 1. |
maxvalue | The optional clause MAXVALUE maxvalue determines the maximum value for the sequence. If this clause is not supplied or NO MAXVALUE is specified, then default values will be used. The defaults are 2^63 - 1 and -1 for ascending and descending sequences, respectively. |
minvalue | The optional clause MINVALUE minvalue determines the minimum value a sequence can generate. If this clause is not supplied or NO MINVALUE is specified, then defaults will be used. The defaults are 1 and -(2^63 - 1) for ascending and descending sequences, respectively. |
name | The name (optionally schema-qualified) of the sequence to be created. |
start | The optional clause START WITH start allows the sequence to begin anywhere. The default starting value is minvalue for ascending sequences and maxvalue for descending ones. |
TEMPORARY or TEMP | If specified, the sequence object is created only for this session, and is automatically dropped on session exit. Existing permanent sequences with the same name are not visible (in this session) while the temporary sequence exists, unless they are referenced with schema-qualified names. |
Limitations
When a table column uses a sequence as its DEFAULT, the column keeps a dependency on that sequence. The default can be changed with ALTER TABLE ... ALTER COLUMN ... SET DEFAULT — here it is reset to NULL, so subsequent rows no longer draw from the sequence:
CREATE SEQUENCE id_sequence START 1;
CREATE TABLE tbl ( id INTEGER DEFAULT nextval('id_sequence'), s VARCHAR);
INSERT INTO tbl(s) VALUES ('default is the next value from id_sequence');
ALTER TABLE tbl ALTER COLUMN id SET DEFAULT NULL;
INSERT INTO tbl(s) VALUES ('default is NULL');
SELECT * FROM tbl; id | s------+-------------------------------------------- 1 | default is the next value from id_sequence NULL | default is NULLWhile a table column still depends on the sequence through a DEFAULT nextval(...) expression, attempting to drop the sequence results in an error:
DROP SEQUENCE id_sequence;db error: ERROR: cannot drop sequence id_sequence because other objects depend on itDETAIL: table tbl depends on sequence id_sequenceHINT: Use DROP ... CASCADE to drop the dependent objects too, or DROP TABLE on the owning table.As the error message suggests, you can force dropping by adding CASCADE. This removes the dependency and the column default, but keeps the table and its existing data:
DROP SEQUENCE id_sequence CASCADE;
SELECT * FROM tbl; id | s----+-------------------------------------------- 1 | default is the next value from id_sequence