Reset Postgres table sequence after DELETE

When deleting recent records from a table, you can reset it's sequence counter if auto-increment field continuity is important to you. Consider actions on the following table, users
 
select max(id) from users;

+-----+ 
| max | 
+-----+ 
| 896 | 
+-----+ 
1 rows in set (0.03 sec)

Then, some delete action against most recent rows: 
delete from users where created_at > timestamp 'yesterday';
96 rows in set (0.15 sec) 

The next auto-increment value for id would be 897 on the next insert. Use the following command to reduce the sequence value for the users table by 96.
select setval('users_id_seq',(select max(id) from users));

+--------+
| setval |
+--------+
| 800    |
+--------+
1 rows in set (0.04 sec)

Why Reset the Sequence?


Resetting a sequence in Postgres is necessary when you want to reinitialize the sequence to a new starting value, allowing for a new contiguous sequence to be generated. This is often required when you need to merge data from multiple databases, change the structure of your database, or recover from data corruption. By resetting the sequence, you can ensure that your primary key columns continue to generate unique and contiguous integers.

Understanding the Primary Key Sequence


A primary key sequence is a database object used to generate unique integer values for primary key columns in a table. It is a crucial component of a relational database management system, as it ensures that each row in a table has a unique identifier. The primary key sequence is typically created when a table is created, and it is used to generate values for the primary key column. Understanding how the primary key sequence works is essential for managing your database effectively.

How to Reset the Sequence


To reset a sequence in Postgres, you can use the ALTER SEQUENCE command. This command allows you to change the definition of a sequence generator, including its starting value, increment, and maximum value. To reset the sequence, you need to specify the name of the sequence, the new starting value, and the increment. For example, to reset a sequence called “my_sequence” to start from 100 with an increment of 1, you would use the following command: ALTER SEQUENCE my_sequence RESTART WITH 100 INCREMENT BY 1; Alternatively, you can use the SETVAL function to reset the sequence to a specific value. This function sets the current value of the sequence to the specified value, and it can be used to reset the sequence to a new starting value. For example: SELECT setval('my_sequence', 100);

Precautions and Considerations


Before resetting a sequence, it is essential to take precautions to avoid data corruption or inconsistencies. Here are some considerations to keep in mind:

  • Make sure you have a backup of your database before making any changes to the sequence.
  • Ensure that you have the necessary permissions to modify the sequence.
  • Be careful when resetting the sequence, as it can affect the integrity of your data.
  • Consider the impact of resetting the sequence on your application and users.

Alternative Methods


In addition to using the ALTER SEQUENCE command or the SETVAL function, there are alternative methods for resetting a sequence in Postgres. One approach is to use the pg_get_serial_sequence function to retrieve the name of the sequence associated with a column, and then use the ALTER SEQUENCE command to reset the sequence. For example: SELECT pg_get_serial_sequence('my_table', 'id'); ALTER SEQUENCE my_table_id_seq RESTART WITH 100; Another approach is to use the SQL function to migrate the primary key sequence to a new starting value. This can be particularly useful when you need to ensure that the sequence values are contiguous and unique across multiple tables or databases.
1.07 Thousand
Jeff

Get our stories delivered

From us to your inbox weekly.