5

I'm having a table where I sometimes enter data in inline editors where I manually add the id value which is usually auto-incremented.

In a case where id 4 was auto generated using scripts and then id 5 & 6 were added inline, whenever I run a insert query the db tries to auto-increment the value 4. But the value 5 has been added to database by a user using an inline editor. In such a case I used a script as below

SELECT SETVAL('<tableName>_id_seq', (SELECT MAX(id) FROM <tableName>));

Then the auto increment value gets assigned to the maximum id value the database currently contains thereby auto-incrementing for the insert queries successfully.

The issue I'm facing is when ever I clear the database, is there a method to reset the auto-increment value to 0 or something so the next insert queries will begin inserting with a value of 1 to the id column?

1
  • 1
    What's wrong with using setval('..', 0)? Commented May 25, 2020 at 21:13

3 Answers 3

3

Seems I've found a handy answer for my question

ALTER SEQUENCE <tableName>_id_seq RESTART;

If you want to restart the id from a specific index (for example, you need to update the table packing_list and the column uid with the index 94), you can use the below query

ALTER SEQUENCE packing_list_item_uid_seq RESTART WITH 94;

Hope this helps

Sign up to request clarification or add additional context in comments.

Comments

1

Here is an example of what i do i my sql to restart the index from my database. I use this code when resetting the entities for unit testing my api.

In my database i have a table terminal:

CREATE TABLE IF NOT EXISTS terminal(
    id SERIAL PRIMARY KEY,
    "serialNumber" VARCHAR(255),
    "storeCode" VARCHAR(100),
    "modelCode" VARCHAR(31)
);

It will create a table with a primary key terminal_id_seq.

ALTER SEQUENCE terminal_id_seq RESTART WITH 1;
DELETE FROM terminal;
--redo the inserts
INSERT INTO terminal ("id", "serialNumber", "storeCode","modelCode") VALUES (10,'abc','def','blabla');

Hope it helps.

1 Comment

ALTER SEQUENCE terminal_id_seq RESTART WITH 1; This line was what I wanted. Thanks
1

There are a number of ways to do this as outlined above, but if you want a more idempotent way to do it (which you do), then I'd recommend:

SELECT SETVAL('<tableName>_id_seq', COALESCE((SELECT MAX(id) FROM <tableName>),1));

This way you can use the same code whether you have rows in the table or not, and it will do the right thing.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.