ChatGPT解决这个技术问题 Extra ChatGPT

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

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

ALTER TABLE product AUTO_INCREMENT = 1453

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

我是 postgres 的新手 :(

我有一个带有 Idname 字段的表 product

如果是新的,为什么不使用 pgAdmin 并检查它将生成的命令?
通常表被命名为“产品”而不是“产品”。在这种情况下,您的序列将被命名为“products_id_seq”。确保您正在寻找正确的序列。

s
slezica

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

这是您需要的 ALTER SEQUENCE 命令:

ALTER SEQUENCE product_id_seq RESTART WITH 1453

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


从这条消息中不清楚正确的语法是什么。它是:ALTER SEQUENCE product_id_seq RESTART WITH 1453;
仅仅因为我对上述内容的解析不佳,这是我重申完全相同的事情的方式。语法是 ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #,其中“seq”是文字文本,您输入一个数字作为 #。不要忽略下划线。 :-)
请注意,如果不使用公共架构,则需要以 my_schema 作为前缀。 ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453
请注意,您重新启动时使用的值是您要使用的 next 值。因此,如果您已经有一条 ID 为 1453 的记录,则应为 RESTART WITH 1454
使用 IDENTITY 列约束,您可以执行 ALTER TABLE tbl ALTER COLUMN id RESTART SET START 1453
L
Loolooii

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

TRUNCATE TABLE someTable RESTART IDENTITY;

当心 - 这也会删除您的所有数据
@Loolooii,只是标记它;如果不熟悉 SQL 的人在这里搜索,因为他们手动向具有自动增量字段的表中添加了一行(例如,通过 ORM),那么这个解决方案可能不是他们所期望的。
TABLE 关键字是多余的。 TRUNCATE someTable RESTART IDENTITY; 就足够了。
@ihossain 你试过 TRUNCATE someTable RESTART IDENTITY CASCADE; 吗?
对于引用的表,您可以执行 TRUNCATE table2, table1 RESTART IDENTITY;
S
Slava Rozhnev

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

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

C
Clodoaldo Neto

设置序列计数器:

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    | 

选择 setval('product_id_seq', 1453);为我工作
我正在尝试选择 pg_get_serial_sequence('Domain.products', 'id');但抱怨架构不存在。如何运行此查询?我是 psql 的新手。
O
Ondrej Slinták
-- Change the starting value of the sequence

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


如果我没记错的话,PG 用 last_value 和 is_call 表示它们的序列,从 (1, false) 开始,然后 (1, true), (2, true)... 所以 MAX(id) + 1 应该是 MAX (id) 而不是跳过一个 id。
我还必须重新启动我的 postgres 实例才能使其正常工作。 brew services restart postgresql
SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));完美运行但是有没有办法将增量值重置为 0。所以新条目以 0 索引开头?
A
Anwar

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

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

ALTER SEQUENCE product_id_seq RESTART WITH 1453;

i
isapir

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

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

在没有 sequence 或您不能截断表格的情况下,一个 + 表示可用性。我认为这是最好的答案
I
Ivan

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

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

最有用的答案。谢谢!
h
humble_wolf

2021 年,Postgres 11.12

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

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

它也适用于 Postgres 12.8,谢谢
A
Apurv Chaudhary

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

转到您的数据库单击表列表页面中的公共,您可以看到诸如“表”、“视图”、“序列”之类的 TABS。单击“序列”时单击序列,您可以看到所有序列列表,单击要重置的任何内容之后,您可以看到多个选择,例如“更改”、“设置值”、“重新启动”、“重置”等等...然后单击重置,然后添加一个新行。


V
Vinoth Shankar

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

句法:

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;

R
Raja A

要获取序列 ID,请使用

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

这将为您提供 sequesce 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

T
Thushara Buddhika

使用此查询检查带有模式和表的序列键是什么,

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

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

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

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

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

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

插入表时,下一个递增值将用作键 (121)。


感谢您指出如何获取不同模式的 seqName :)
J
Jeb50

如果表像

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

0-9 范围内插入一些记录后,会导致下一个 insert 发生冲突,因此要重置 START:

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

a
abby

请注意,如果您的表名带有“_”,它将在序列名称中删除。

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


对我来说不是这样。我有相同的条件,但下划线保留在序列名称的名称中
G
GarryOne

节点脚本:修复所有表身份:自动增量/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();

S
Sufiyan Ansari

我不确定以上所有答案,如果我没有序列名称怎么办?如果我不想截断我的表格怎么办?

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

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