I have and existing database, which I have migrated with SQLAlchemy to a new PostgreSQL database.
I moved all primary keys with the same values as before. Now I have tables filled with data, but the associated sequences starts from 1. I have pk values stored 1 to 2000.
Now, when I try to save something with Django, I have the
duplicate key value violates unique constraint
regarding to the Primary Key.
How can I modify the sequence start values or escape this situation?
My current solution is:
conn = psycopg2.connect(...)
for table_name in table_names:
cursor = conn.cursor()
cursor.execute("""
SELECT setval('%s_id_seq', (SELECT COALESCE(MAX(id),0)+1 FROM %s));
"""% (table_name, table_name))
It works for me, but I don’t like it.
Ways to set / reset a sequence in PostgreSQL
(not necessarily to
max(id)).There’s the simple way you have in the question. You can set the sequence to start at an arbitrary number with
setval():Then there’s the standard SQL way with
ALTER SEQUENCEdoing the same:If you like to restart your sequences at numbers other than the default 1:
And there is another way, when you empty a table with TRUNCATE:
Implicitly executes
ALTER SEQUENCE foo_id_seq RESTART;