How to Create a Repeating Sequence in PostgreSQL

When we create a sequence in PostgreSQL, we have the option of making it a non-repeating sequence or repeating sequence.

By “repeating” sequence, I mean that, once it reaches its maximum value (or minimum if it’s a descending sequence), it starts all over again, re-using numbers previously generated.

To create a repeating sequence, we use the CYCLE keyword when creating the sequence. By default, it’s created as NO CYCLE, but we can change this simply by specifying CYCLE.

Example

Here’s an example of creating a repeating sequence:

CREATE SEQUENCE Sequence1
    START 1
    MAXVALUE 3
    CYCLE;

This sequence will cycle between 1 and 3. Once it reaches 3 it will start again at 1, and so on.

Let’s see it in action:

SELECT nextval('Sequence1')
UNION ALL
SELECT nextval('Sequence1')
UNION ALL
SELECT nextval('Sequence1')
UNION ALL
SELECT nextval('Sequence1')
UNION ALL
SELECT nextval('Sequence1')
UNION ALL
SELECT nextval('Sequence1')
UNION ALL
SELECT nextval('Sequence1')
UNION ALL
SELECT nextval('Sequence1');

Result:

 nextval 
---------
       1
       2
       3
       1
       2
       3
       1
       2

Descending Sequences

The CYCLE argument applies equally to descending sequences.

Example:

CREATE SEQUENCE Sequence2
    START 0
    INCREMENT -1
    MINVALUE -3
    MAXVALUE 0
    CYCLE;

This sequence will cycle between 0 and -3. Once it reaches -3 it will start again at 0, and so on.

Let’s see it in action:

SELECT nextval('Sequence2')
UNION ALL
SELECT nextval('Sequence2')
UNION ALL
SELECT nextval('Sequence2')
UNION ALL
SELECT nextval('Sequence2')
UNION ALL
SELECT nextval('Sequence2')
UNION ALL
SELECT nextval('Sequence2')
UNION ALL
SELECT nextval('Sequence2')
UNION ALL
SELECT nextval('Sequence2');

Result:

 nextval 
---------
       0
      -1
      -2
      -3
       0
      -1
      -2
      -3
(8 rows)