在postgres中重置自动增量计数器

时间:2011-03-17 16:55:03

标签: sql postgresql reset auto-increment

我想强制一个表的自动增量字段为某个值,我尝试了这个:

ALTER TABLE product AUTO_INCREMENT = 1453

AND

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

我是postgres的新手:(

我有productId字段

的表格name

15 个答案:

答案 0 :(得分:217)

如果您使用product列创建了表格id,则该序列不仅仅称为product,而是product_id_seq(即${table}_${column}_seq })。

这是您需要的ALTER SEQUENCE命令:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

您可以使用psql中的\ds命令查看数据库中的序列。如果您执行\d product并查看列的默认约束,nextval(...)调用也会指定序列名称。

答案 1 :(得分:139)

这是您要查找的命令,假设产品表的序列是product_id_seq:

  

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

答案 2 :(得分:109)

以下命令会自动为您执行此操作:这也将删除表中的所有数据。所以要小心。

TRUNCATE TABLE someTable RESTART IDENTITY;

答案 3 :(得分:52)

设置序列计数器:

setval('product_id_seq', 1453);

如果您不知道序列名称,请使用pg_get_serial_sequence函数:

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

参数是表名和列名。

或者只是在\d product提示符处发出psql

=> \d product
                         Table "public.product"
 Column |  Type   |                      Modifiers                       
--------+---------+------------------------------------------------------
 id     | integer | not null default nextval('product_id_seq'::regclass)
 name   | text    | 

答案 4 :(得分:12)

为方便访问者而从评论转换

从这条消息中不清楚正确的语法是什么。它是:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

答案 5 :(得分:4)

如果您想从GUI重新重置自动增量,请按照以下步骤操作。

  1. 转到数据库
  2. 点击公开
  3. 在表格列表页面中的
  4. ,您可以看到 TABS ,例如'表','视图','序列'那样的。
  5. 点击序列
  6. 当您点击'序列'您可以看到所有序列列表,点击任何您想要重置
  7. 之后,您可以看到多种选择,例如“更改”,“设置价值”,“重新启动”,“重置”等等#39;重置'重置'重置'重置'重置'重置'重置'重置'等...
  8. 然后点击重置,然后添加一个新行。

答案 6 :(得分:2)

要重置自动增量,您必须使用以下查询来获取序列名称。

语法:

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

示例:

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

查询将返回autoid的序列名称为“Demo_autoid_seq” 然后使用以下查询重置autoid

语法:

ALTER SEQUENCE sequenceName RESTART WITH value;

示例:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;

答案 7 :(得分:2)

如果您有一个带有IDENTITY列的表,要为其重置下一个值,则可以使用以下命令:

ALTER TABLE ALTER COLUMN重新启动;

答案 8 :(得分:2)

-更改序列的起始值

ALTER SEQUENCE project_id_seq RESTART 3000;

相同但动态:

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

我同意使用SELECT会令人不安,但它可以正常工作。

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

答案 9 :(得分:1)

使用此查询来检查什么是具有架构和表的序列键

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

使用此查询一个一个地增加增量值,

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

当插入表时,下一个增加的值将用作键(111)。

使用此查询将特定值设置为增量值

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

当插入表格时,下一个增加的值将用作键(121)。

答案 10 :(得分:0)

要获取序列ID,请使用

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

这将为您提供ID为 tableName_ColumnName_seq

的ID

使用上一个种子号获取

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

或者如果您知道序列ID已经直接使用它。

select currval(tableName_ColumnName_seq);

它将为您提供最后的种子编号

要重置种子编号,请使用

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45

答案 11 :(得分:0)

请注意,如果您的表名带有'_',则会以序列名将其删除。

例如,表名称:user_tokens列:id 序列名称:usertokens_id_seq

答案 12 :(得分:0)

节点脚本:修复所有表的身份:自动递增/nextval,基于最后插入它。

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();

答案 13 :(得分:0)

要将其设置为您可以使用的下一个最高值:

SELECT SETVAL(pg_get_serial_sequence('table_name', 'column_name'), (SELECT MAX(column_name) FROM table_name));

答案 14 :(得分:0)

2021 年,Postgres 11.12

ALTER SEQUENCE 对我不起作用,它以某种方式将其重置为 null。 对我有用的是:

SELECT setval('<table>_<column>_seq', 5);