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

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

ALTER TABLE product AUTO_INCREMENT = 1453

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

我是postgres的新手:(

我有一个表productIdname字段

322456 次浏览

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

这是你需要的ALTER SEQUENCE命令:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

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

设置序列计数器:

setval('product_id_seq', 1453);

如果你不知道序列名,使用pg_get_serial_sequence函数:

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

参数是表名和列名。

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

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

下面是你要找的命令,假设你的product表序列是product_id_seq:

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

下面的命令为您自动完成此操作

TRUNCATE TABLE someTable RESTART IDENTITY;

为了方便访问者,从评论中转换过来的

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

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

要重置自动递增,您必须通过使用以下查询获得您的序列名。

语法:

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;

如果你想要重置从GUI自动递增,那么遵循以下步骤。

  1. 去你的数据库
  2. 单击公共
  3. 在表列表页面,你可以看到选项卡像“表”,“视图”,“序列”这样的。
  4. 单击序列
  5. 当你点击“Sequences”,你可以看到所有的Sequences列表,点击任何你想重置
  6. 之后,你可以看到多种选择,如“改变”,“设置值”,“重新启动”,“重置”等…
  7. 然后单击重置,然后添加一个新行。

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

ALTER TABLE <table name>
ALTER COLUMN <column name>
RESTART WITH <new value to restart with>;
-- Change the starting value of the sequence


ALTER SEQUENCE project_id_seq RESTART 3000;

相同但充满活力:

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

SELECT的使用很奇怪,但它有效。

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

编辑:删除+1建议在评论

获取序列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

注意,如果表名带有'_',它将在序列名中被删除。

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

.序列名:usertokens_id_seq

.序列名:usertokens_id_seq

使用这个查询来检查什么是序列的关键与Schema和Table,

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

使用这个查询逐个增加增量值,

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

当插入到下一个表时,增量值将被用作键(111)。

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

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

当插入到下一个表时,增量值将被用作键(121)。

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

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

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

2021年Postgres 11.12

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

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

如果表格是这样的

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

在插入一些0-9范围内的记录后,会引起下一个insert的冲突,因此要重置START:

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

我不确定以上所有的答案, 如果我没有序列名呢? 如果我不想截断我的表呢?< / p >

下面的查询帮助我做到这一点,而不影响现有的数据。

ALTER TABLE <<table_name>>
ALTER COLUMN <<primary_key_column_name>> RESTART SET START 4044;