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

ALTER TABLE product AUTO_INCREMENT = 1453

AND

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

我有一个表产品与Id和名称字段


当前回答

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

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

其他回答

如果你有一个带有IDENTITY列的表,你想要重置下一个值,你可以使用以下命令:

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;

如果您使用id列创建了表product,那么序列就不是简单地称为product,而是product_id_seq(即${table}_${column}_seq)。

这是你需要的ALTER SEQUENCE命令:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

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

节点脚本:修复所有表identity: auto-increment / 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();

如果表格是这样的

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

插入0-9范围内的记录后,会导致下次插入时发生冲突,因此重置START:

ALTER TABLE ... ALTER COLUMN ... RESTART WITH 10;

获取序列id使用

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

这将为您提供序列id tableName_ColumnName_seq

要获得最后的种子数量使用

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

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

select currval(tableName_ColumnName_seq);

它会告诉你最后的种子号

重置种子数量使用

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45