396

I would like to force the auto increment field of a table to some value, I tried with this:

ALTER TABLE product AUTO_INCREMENT = 1453

AND

ALTER SEQUENCE product  RESTART WITH 1453;
ERROR:  relation "your_sequence_name" does not exist

I have a table product with Id and name field

starball
  • 20,030
  • 7
  • 43
  • 238
Rad
  • 4,403
  • 4
  • 24
  • 25
  • 5
    If new why not use pgAdmin and inspect the commands it will generate? – Unreason Mar 17 '11 at 17:06
  • 1
    Usually tables are named like 'products" and not like a "product". In this case your sequence will be named like "products_id_seq". Be sure that you are looking for a correct sequence. – Alexander Gorg Jun 14 '17 at 12:02

18 Answers18

529

If you created the table product with an id column, then the sequence is not simply called product, but rather product_id_seq (that is, ${table}_${column}_seq).

This is the ALTER SEQUENCE command you need:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

You can see the sequences in your database using the \ds command in psql. If you do \d product and look at the default constraint for your column, the nextval(...) call will specify the sequence name too.

salezica
  • 74,081
  • 25
  • 105
  • 166
araqnid
  • 127,052
  • 24
  • 157
  • 134
  • 70
    It's not clear from this message what the correct syntax is. It is: ALTER SEQUENCE product_id_seq RESTART WITH 1453; – Liron Yahdav May 03 '12 at 22:19
  • 14
    Just because I parsed the above poorly, here's my way of restating the exact same thing. The syntax is `ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #`, where "seq" is the literal text, and you put in a number for #. Do not neglect the underscores. :-) – kmort May 21 '15 at 17:32
  • 10
    Please note that if not using the public schema it is needed to prefix with my_schema. `ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453` – Daniel L. VanDenBosch Apr 10 '18 at 13:04
  • Does anyone know why ALTER SEQUENCE product_id_seq RESTART WITH (SELECT MAX(id) from product); Doesn't work? The only way I found is to use two separate queries. – Chris Huang-Leaver Dec 20 '18 at 03:14
  • 22
    Note that the value you restart with is the *next* value you want to use. So if you already have a record with id `1453`, you should `RESTART WITH 1454`. – hughes Mar 21 '19 at 21:58
  • yea but how do you know what table that is? multiple tables might have that. Or if you named the id product_id on table product then what? – PositiveGuy Nov 26 '20 at 00:55
  • 3
    with `IDENTITY` column constraints, you do `ALTER TABLE tbl ALTER COLUMN id RESTART SET START 1453` – Bastien Durel Jan 26 '21 at 10:14
  • If you want to reset your auto increment to the beginning reset it to 1 (not 0) and certainly not 1453. – rishi Jun 14 '21 at 10:32
  • This worked for me: `select setval('"Products_id_seq"', 1453);` (My own usecase) – Ankit Shubham Aug 14 '21 at 09:44
  • It doesn't work without double quotes for me `ALTER SEQUENCE "product_id_seq" RESTART WITH 1453`. – Arthur Feb 03 '22 at 13:20
  • Usually you would need quotes if your sequence name has upper-case characters, because postgresql will downcase unquoted identifiers – araqnid Mar 21 '22 at 17:14
  • ``ALTER SEQUENCE "Product_id_seq" RESTART WITH 1453`` use Quotation marks if your table name has uppercase – gidgud Aug 04 '23 at 04:27
190

The following command does this automatically for you: This will also delete all the data in the table. So be careful.

TRUNCATE TABLE someTable RESTART IDENTITY;
Loolooii
  • 8,588
  • 14
  • 66
  • 90
  • 43
    Beware - this will delete all of your data as well – kibibu Oct 06 '13 at 22:20
  • 34
    @Loolooii, Just flagging it; if somebody unfamiliar to SQL is searching here because they manually added a row to a table with an autoincrement field (through an ORM, for example), then this solution is probably not what they expect. – kibibu Oct 09 '13 at 03:15
  • 2
    The `TABLE` keyword is redundant. `TRUNCATE someTable RESTART IDENTITY;` is enough. – user1 Oct 03 '16 at 08:17
  • 9
    @ihossain have you tried `TRUNCATE someTable RESTART IDENTITY CASCADE;` ? – Vedran May 31 '19 at 15:12
  • 2
    For referenced tables you can do `TRUNCATE table2, table1 RESTART IDENTITY;` – Zeeshanef Jun 30 '19 at 09:45
165

Here is the command that you are looking for, assuming your sequence for the product table is product_id_seq:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;
Slava Rozhnev
  • 9,510
  • 6
  • 23
  • 39
matt snider
  • 4,013
  • 4
  • 24
  • 39
67

To set the sequence counter:

setval('product_id_seq', 1453);

If you don't know the sequence name use the pg_get_serial_sequence function:

select pg_get_serial_sequence('product', 'id');
 pg_get_serial_sequence 
------------------------
 public.product_id_seq

The parameters are the table name and the column name.

Or just issue a \d product at the psql prompt:

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 
Clodoaldo Neto
  • 118,695
  • 26
  • 233
  • 260
49
-- Change the starting value of the sequence

ALTER SEQUENCE project_id_seq RESTART 3000;

Same but dynamic :

SELECT SETVAL('project_id_seq', (SELECT MAX(id) FROM project));

The use of a SELECT is weird but it works.

Source: https://kylewbanks.com/blog/Adding-or-Modifying-a-PostgreSQL-Sequence-Auto-Increment

Edit: removed +1 as suggested in the comments

befabry
  • 672
  • 5
  • 13
  • 1
    If I'm not mistaken, PG represents their sequences with last_value and is_called, starts at (1, false), then (1, true), (2, true)... so the MAX(id) + 1 should be MAX(id) instead to not skip an id. – Ten Jul 17 '19 at 09:47
  • I also had to restart my postgres instance for this to work. [`brew services restart postgresql`](https://apple.stackexchange.com/a/278268/107169) – BigRon Jan 31 '20 at 23:00
  • SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project)); Works perfectly But is there a way to reset the increment value to 0. So the new entries begin with a 0 index ? – Charith Jayasanka May 25 '20 at 21:00
  • No need to add `+1`, just use `MAX(column_name)`. If you add `+1`, it will skip a value in the sequence. – Dima L. Sep 20 '22 at 06:28
18

If you have a table with an IDENTITY column that you want to reset the next value for you can use the following command:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;
isapir
  • 21,295
  • 13
  • 115
  • 116
BrianB
  • 411
  • 1
  • 4
  • 11
  • 5
    One + for usability in case of there's no `sequence` or you can NOT truncate the table. I think it's best answer – ABS Sep 18 '19 at 12:18
18

To set it to the next highest value you can use:

SELECT SETVAL(pg_get_serial_sequence('table_name', 'column_name'), (SELECT MAX(column_name) FROM table_name));
Ivan
  • 191
  • 2
  • 4
  • Most useful answer. Thanks! – Ulvi Oct 27 '21 at 08:04
  • 1
    This fit me the best. Make sure to add a `+1` to the max() though. That is: `SELECT SETVAL(pg_get_serial_sequence('table_name', 'column_name'), (SELECT MAX(column_name) + 1 FROM table_name));` – Siddharth Venu Aug 16 '22 at 19:30
  • No need to add `+1`, just use `MAX(column_name)`. If you add `+1`, it will skip a value in the sequence. – Dima L. Sep 20 '22 at 06:28
17

Converted from comment for the sake of visitor's convenience

It's not clear from this message what the correct syntax is. It is:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;
Anwar
  • 1,755
  • 1
  • 21
  • 32
13

Year 2021, Postgres 11.12

ALTER SEQUENCE did not worked for me, it resets it to null somehow. What worked for me is:

SELECT setval('<table>_<column>_seq', 5);
humble_wolf
  • 1,497
  • 19
  • 26
10

if you want to Reset auto increment from GUI, then follow this steps.

  1. Go to your Database
  2. Click on Public
  3. in the tables Listing page you can see TABS like 'Tables', 'Views', 'Sequences' like that.
  4. Click on Sequences
  5. when you click on 'Sequences' you can see all the Sequences Listing, click on any that you want to Reset
  6. After that you can see multiple choice like 'Alter', 'Set Value', 'Restart', 'Reset' etc...
  7. then click on Reset, then add one New Row.
Apurv Chaudhary
  • 1,672
  • 3
  • 30
  • 55
7

To reset the auto increment you have to get your sequence name by using following query.

Syntax:

SELECT pg_get_serial_sequence(‘tablename’, ‘ columnname‘);

Example:

SELECT pg_get_serial_sequence('demo', 'autoid');

The query will return the sequence name of autoid as "Demo_autoid_seq" Then use the following query to reset the autoid

Syntax:

ALTER SEQUENCE sequenceName RESTART WITH value;

Example:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;
Terrible Coder
  • 880
  • 9
  • 10
5

To get sequence id use

SELECT pg_get_serial_sequence('tableName', 'ColumnName');

This will gives you sequesce id as tableName_ColumnName_seq

To Get Last seed number use

select currval(pg_get_serial_sequence('tableName', 'ColumnName'));

or if you know sequence id already use it directly.

select currval(tableName_ColumnName_seq);

It will gives you last seed number

To Reset seed number use

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45
Raja A
  • 89
  • 1
  • 4
5

Use this query to check what is the Sequence Key with Schema and Table,

SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"

Use this query increase increment value one by one,

SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110

When inserting to table next incremented value will be used as the key (111).

Use this query to set specific value as the incremented value

SELECT setval('"SchemaName"."SequenceKey"', 120);

When inserting to table next incremented value will be used as the key (121).

Thushara Buddhika
  • 1,652
  • 12
  • 14
3

If table is like

bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 0)

After inserting some records in the range of 0-9, will cause conflict for next insert, so to reset the START:

ALTER TABLE ... ALTER COLUMN ... RESTART WITH 10;
Jeb50
  • 6,272
  • 6
  • 49
  • 87
2

I am not sure about all of the above answers, What if I don't have a sequence name? What if I don't want to truncate my table?

Below query helped me to do that without affecting the existing data.

ALTER TABLE <<table_name>>
    ALTER COLUMN <<primary_key_column_name>> RESTART SET START 4044;
Sufiyan Ansari
  • 1,780
  • 20
  • 22
1

Node script: Fix all tables identity: auto-increment / nextval, based on last inserted it.

const pg = require('pg');
const { Client } = pg;

const updateTables = async () => {

  const client = new Client({
    user: 'postgres',
    host: 'localhost',
    database: 'my-database',
    password: 'postgres',
    port: 5432,
  });

  await client.connect();

  console.log('Connected');

  const execQuery = async (queryStr, params = []) => {
    return new Promise((resolve, reject) => {
      client.query(queryStr, params, (error, results) => {
        if (error) {
          reject(error);
        } else {
          resolve(results);
        }
      })
    })
  }

  const tablesRes = await execQuery(`
    SELECT table_name
    FROM information_schema.tables
    WHERE table_type='BASE TABLE'
    AND table_schema='public';
  `)

  const tables = tablesRes.rows.map(row => row.table_name);

  tables.map(async tableName => {
    let lastId;
    try {
      const res = await execQuery(`SELECT id from "${tableName}" ORDER BY id DESC LIMIT 1`);
      lastId = res.rows[0].id;
    } catch (e) {}

    if (lastId) {
      const nextId = lastId + 1;
      const queryStr = `ALTER SEQUENCE ${tableName}_id_seq RESTART WITH ${nextId}`;
      await execQuery(queryStr);
      console.log(tableName, queryStr);
    }
  })

};

updateTables();
GarryOne
  • 1,430
  • 17
  • 21
1
ALTER SEQUENCE public."Table_Id_seq"
RESTART 50;

this query worked for me. Postgresql version 14

0

Note that if you have table name with '_', it is removed in sequence name.

For example, table name: user_tokens column: id Sequence name: usertokens_id_seq

abby
  • 680
  • 2
  • 10
  • 22
  • That's not the case for me. I have the same condition but the underscore is preserved in the name of the sequence name – Ulvi Oct 27 '21 at 07:55