Skip to main content

CREATE SEQUENCE

The CREATE SEQUENCE statement creates a new sequence number generator.

Examples

Generate an ascending sequence starting from 1:

Query
CREATE SEQUENCE serial;

Generate sequence from a given start number:

Query
CREATE SEQUENCE serial START 101;

Generate odd numbers using INCREMENT BY:

Query
CREATE SEQUENCE serial START WITH 1 INCREMENT BY 2;

Descending sequences are not yet supported. A negative INCREMENT BY is rejected:

Query
CREATE SEQUENCE serial START WITH 99 INCREMENT BY -1 MAXVALUE 99;
Result
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:

Query
SELECT nextval('serial');
Result
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:

Query
SELECT nextval('serial') AS nextval;
Result
 nextval---------       1

Creating and Dropping Sequences

Sequences can be created and dropped similarly to other catalog items.

Overwrite an existing sequence:

Query
CREATE OR REPLACE SEQUENCE serial;

Only create sequence if no such sequence exists yet:

Query
CREATE SEQUENCE IF NOT EXISTS serial;

Remove sequence:

Query
DROP SEQUENCE serial;

Remove sequence if exists:

Query
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:

Query
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;
Result
 id | s----+-------  1 | hello  2 | world

You 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:

Query
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:

Query
CREATE SEQUENCE serial START 1;
SELECT nextval('serial') AS nextval;
Result
 nextval---------       1

Using this sequence in an INSERT command:

Query
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.

Query
CREATE SEQUENCE serial START 1;
SELECT nextval('serial') AS nextval;
SELECT currval('serial') AS currval;
Result
 nextval---------       1
 currval---------       1

Syntax

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

NameDescription
CYCLE or NO CYCLEThe 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.
incrementThe 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.
maxvalueThe 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.
minvalueThe 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.
nameThe name (optionally schema-qualified) of the sequence to be created.
startThe 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 TEMPIf 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:

Query
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;
Result
 id   | s------+--------------------------------------------    1 | default is the next value from id_sequence NULL | default is NULL

While a table column still depends on the sequence through a DEFAULT nextval(...) expression, attempting to drop the sequence results in an error:

Query
DROP SEQUENCE id_sequence;
Result
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:

Query
DROP SEQUENCE id_sequence CASCADE;
SELECT * FROM tbl;
Result
 id | s----+--------------------------------------------  1 | default is the next value from id_sequence