‘CREATE
SEQUENCE’ statement define a sequence generator. Once a sequence is defined,
you can use the functions nextval, currval, and setval to operate on the
sequence.
Example
1: Sequence of
numbers from 1 to 5.
[1, 2, 3,
4, 5]
Example
2: Sequence of
numbers from 2 to 10 with an increment of 2.
[2, 4, 6,
8, 10]
Example
3: Descending
sequence of numbers from 10 with an increment of -2
[10, 8, 6,
4, 2, 0, -2, -4…..]
Synopsis
CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name
[ AS data_type ]
[ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
[ OWNED BY { table_name.column_name | NONE } ]
Clauses or
parameters specified in [] are optional.Below table summarizes the different
parameters of CREATE SEQUENCE statement.
|
Parameter
|
Description
|
|
TEMPORARY
| TEMP
|
With
this the sequence object is created only for this session. This sequence
object is deleted on the session exit.
|
|
IF NOT
EXISTS
|
Create a
sequence only if the sequence with given name is not exists.
|
|
name
|
Sequence
name
|
|
data_type
|
Specify
sequence data type. bigint is used as default, apart from bigint, you can
use smallint and integer.
|
|
increment
|
Specify
the value to be added to existing sequence to get new value. A positive
increment generate an ascending sequence, where as a negative increment generate
a descending sequence.
|
|
minvalue
|
Specifies
the minimum value a sequence generate.
a.
Default
for ascending sequence is 1.
b.
Default
for descending sequence is minimum value of data_type
|
|
maxvalue
|
Specifies
the maximum value a sequence generate
a.
Default
for ascending sequence is maximum value of data_type
b.
Default
for descending sequence is -1.
|
|
start
|
Specify
the starting number of sequence. The default starting value is minvalue for
ascending sequences and maxvalue for descending ones.
|
|
cache
|
Specifies
how many sequence numbers are to be preallocated and stored in memory for
faster access.
|
|
CYCLE,
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 or NO CYCLE are
specified, NO CYCLE is the default.
|
|
OWNED BY
table_name.column_name
OWNED BY
NONE
|
The
OWNED BY option causes the sequence to be associated with a specific table
column, such that if that column (or its whole table) is dropped, the
sequence will be automatically dropped as well.
|
Let’s
create a sequence and experiment with it ‘test’ database.
Login
to test database
sh-3.2$ psql -U postgres -h localhost
Password for user postgres:
psql (14.4)
Type "help" for help.
Create
a sequence to generate even positive numbers
CREATE
SEQUENCE even_number_sequence INCREMENT 2 START 2;
test=# CREATE SEQUENCE even_number_sequence INCREMENT 2 START 2;
CREATE SEQUENCE
Let’s
query existing relationships (tables, views, sequences etc.,) using \d or \d+ command.
test=# \d
List of relations
Schema | Name | Type | Owner
public | even_number_sequence | sequence | postgres
(1 row)
test=# \d+
List of relations
Schema | Name | Type | Owner | Persistence | Access method | Size | Description
public | even_number_sequence | sequence | postgres | permanent | | 8192 bytes |
(1 row)
Query
the sequence table
test=# SELECT * FROM even_number_sequence;
last_value | log_cnt | is_called
2 | 0 | f
(1 row)
Whether
this sequence is called or not maintained by the column ‘is_called’.
Get the
next value from sequence table using nextval function
test=# SELECT nextval('even_number_sequence');
nextval
2
(1 row)
test=#
test=# SELECT nextval('even_number_sequence');
nextval
4
(1 row)
Query 'even_number_sequence'
and confirm that the last_value is set to 4 now.
test=# SELECT * FROM even_number_sequence;
last_value | log_cnt | is_called
4 | 31 | t
(1 row)
Get the
current value of sequence using currval function
test=# SELECT currval('even_number_sequence');
currval
4
(1 row)
Set the
next value using setval function
SELECT
setval('even_number_sequence', 18);
Next
nextval will return 20 for the increment of 2
SELECT
setval('even_number_sequence', 18, true);
Same as
above
test=# SELECT setval('even_number_sequence', 18);
setval
18
(1 row)
test=#
test=# SELECT * FROM even_number_sequence;
last_value | log_cnt | is_called
18 | 0 | t
(1 row)
test=#
test=# SELECT nextval('even_number_sequence');
nextval
20
(1 row)
test=#
test=# SELECT * FROM even_number_sequence;
last_value | log_cnt | is_called
20 | 32 | t
(1 row)
SELECT
setval('even_number_sequence', 20, false);
Next
nextval will return 20.
test=# SELECT setval('even_number_sequence', 20, false);
setval
20
(1 row)
test=#
test=# SELECT * FROM even_number_sequence;
last_value | log_cnt | is_called
20 | 0 | f
(1 row)
test=#
test=# SELECT nextval('even_number_sequence');
nextval
20
(1 row)
test=#
test=# SELECT * FROM even_number_sequence;
last_value | log_cnt | is_called
20 | 32 | t
(1 row)
Get all
the sequences in a database?
Query
'information_schema.sequences' to get all the sequences defined in given
database.
test=# SELECT * FROM information_schema.sequences;
sequence_catalog | sequence_schema | sequence_name | data_type | numeric_precision | numeric_precision_radix | numeric_scale | start_value | minimum_value | maximum_value | increment | cycle_option
test | public | even_number_sequence | bigint | 64 | 2 | 0 | 2 | 1 | 9223372036854775807 | 2 | NO
(1 row)
Drop a
sequence
‘DROP
SEQUENCE {sequence_name}’ is used to drop the given sequence.
test=# DROP SEQUENCE even_number_sequence;
DROP SEQUENCE
test=# ^
test=# SELECT * FROM information_schema.sequences;
sequence_catalog | sequence_schema | sequence_name | data_type | numeric_precision | numeric_precision_radix | numeric_scale | start_value | minimum_value | maximum_value | increment | cycle_option
When to
use sequences?
Since
sequences are used to produce unique values, we can use them in primary key auto
generation process of tables. ORM frameworks like Hibernate use sequences to
generate a primary of table. Without a database support for sequences it is
very hard to generate unique incrementing numbers.
References
https://www.postgresql.org/docs/current/sql-createsequence.html
https://www.postgresql.org/docs/current/functions-sequence.html
Previous
Next
Home