w3resource

How to Reset a PostgreSQL Primary Key Sequence When Out of synchronize


Resetting a Primary Key Sequence in PostgreSQL

In PostgreSQL, sequences are often used to automatically generate unique values for primary keys. However, if data is deleted or manually inserted into a table, the sequence can fall out of sync with the actual data, leading to duplicate key errors. To fix this, you can reset the primary key sequence to align with the maximum value currently in the column.

Syntax for Resetting a Primary Key Sequence:

The setval function allows you to reset a sequence by specifying the sequence name and the desired starting value. The following syntax aligns the sequence with the current maximum value in the primary key column:

SELECT setval('sequence_name', COALESCE(MAX(column_name), 1), true) FROM table_name;

Explanation:

  • sequence_name: The name of the sequence associated with the primary key.
  • MAX(column_name): Finds the maximum value in the primary key column to set the sequence correctly.
  • COALESCE(MAX(column_name), 1): Ensures a default value of 1 if the table is empty.
  • true: Specifies that the next value generated should be one higher than the current maximum.

Example:

Suppose you have a table called employees with a primary key column id and a sequence named employees_id_seq. To reset the sequence, you would run:

-- Reset the primary key sequence for the employees table
SELECT setval('employees_id_seq',            -- Specify the sequence to reset
              COALESCE(MAX(id), 1),           -- Set the sequence to the max id, or 1 if empty
              true)                           -- Next value will be max + 1
FROM employees;                               -- Target table for the operation

Explanation:

  • setval('employees_id_seq', COALESCE(MAX(id), 1), true): Resets the sequence to the current maximum value in the id column, or 1 if the table is empty.
  • FROM employees: Specifies the employees table for the MAX(id) calculation.

Steps to Identify and Reset the Sequence Name:

1. Identify Sequence Name: If you don’t know the sequence name, check by querying the pg_get_serial_sequence function:

SELECT pg_get_serial_sequence('table_name', 'column_name');

Example:


SELECT pg_get_serial_sequence('employees', 'id');  -- Finds the sequence for employees.id

2. Run the Reset Command: Using the identified sequence name, execute the setval command.

Important Notes:

  • Perform After Data Changes: Reset the sequence after significant data modifications, like deletions or imports, to avoid conflicts.
  • Transactions: Consider running this command within a transaction block if performing other changes simultaneously.
  • Permissions: Ensure the user running the command has permission to modify sequences.

All PostgreSQL Questions, Answers, and Code Snippets Collection.



Become a Patron!

Follow us on Facebook and Twitter for latest update.

It will be nice if you may share this link in any developer community or anywhere else, from where other developers may find this content. Thanks.

https://www.w3resource.com/PostgreSQL/snippets/resetting-a-primary-key-sequence-in-postgresql.php