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

Rad*_*Rad 195 sql postgresql reset auto-increment

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

ALTER TABLE product AUTO_INCREMENT = 1453
Run Code Online (Sandbox Code Playgroud)

ALTER SEQUENCE product  RESTART WITH 1453;
ERROR:  relation "your_sequence_name" does not exist
Run Code Online (Sandbox Code Playgroud)

我是postgres的新手:(

我有一个表productIdname领域

ara*_*nid 258

如果product使用id列创建表,则不会简单地调用序列product,而是product_id_seq(即${table}_${column}_seq).

这是ALTER SEQUENCE您需要的命令:

ALTER SEQUENCE product_id_seq RESTART WITH 1453
Run Code Online (Sandbox Code Playgroud)

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

  • 从这条消息中不清楚正确的语法是什么.它是:ALTER SEQUENCE product_id_seq RESTART WITH 1453; (65认同)
  • 仅仅因为我解析了上面的不好,这是我重述同样事情的方式.语法是`ALTER SEQUENCE yourTableName_yourColumnName_seq RESTART WITH #`,其中"seq"是文字文本,你输入#的数字.不要忽视下划线.:-) (7认同)
  • 请注意,如果不使用公共架构,则需要以 my_schema 为前缀。`ALTER SEQUENCE my_schema.product_id_seq RESTART WITH 1453` (7认同)
  • 请注意,重新启动时使用的值是您要使用的* next *值。因此,如果您已经有ID为“ 1453”的记录,则应“从1454重新开始”。 (6认同)
  • 使用“IDENTITY”列约束,您可以执行“ALTER TABLE tbl ALTER COLUMN id RESTART SET START 1453” (5认同)

mat*_*der 140

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

ALTER SEQUENCE product_id_seq RESTART WITH 1453;


Loo*_*oii 114

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

TRUNCATE TABLE someTable RESTART IDENTITY;
Run Code Online (Sandbox Code Playgroud)

  • @Loolooii,只是标记它; 如果不熟悉SQL的人在这里搜索,因为他们手动将一行添加到具有自动增量字段的表(例如,通过ORM),那么这个解决方案可能不是他们所期望的. (28认同)
  • 注意 - 这也会删除所有数据 (19认同)
  • @kibibu当然会,它是TRUNCATE :) (6认同)
  • @ihossain 你试过`TRUNCATE someTable RESTART IDENTITY CASCADE;`吗? (5认同)
  • `TABLE` 关键字是多余的。`TRUNCATE someTable RESTART IDENTITY;` 就足够了。 (3认同)
  • 对于引用的表,您可以执行“TRUNCATE table2, table1 RESTART IDENTITY;” (3认同)

Clo*_*eto 53

要设置序列计数器:

setval('product_id_seq', 1453);
Run Code Online (Sandbox Code Playgroud)

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

select pg_get_serial_sequence('product', 'id');
 pg_get_serial_sequence 
------------------------
 public.product_id_seq
Run Code Online (Sandbox Code Playgroud)

参数是表名和列名.

或者只是\d productpsql提示符处发出:

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


bef*_*bry 31

-- Change the starting value of the sequence

ALTER SEQUENCE project_id_seq RESTART 3000;
Run Code Online (Sandbox Code Playgroud)

相同但动态:

SELECT SETVAL('project_id_seq', (SELECT MAX(id) + 1 FROM project));
Run Code Online (Sandbox Code Playgroud)

我同意使用 aSELECT令人不安,但它有效。

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


小智 22

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

SELECT SETVAL(pg_get_serial_sequence('table_name', 'column_name'), (SELECT MAX(column_name) FROM table_name));
Run Code Online (Sandbox Code Playgroud)


Bri*_*anB 14

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

ALTER TABLE <table name> 
    ALTER COLUMN <column name> 
        RESTART WITH <new value to restart with>;
Run Code Online (Sandbox Code Playgroud)

  • 在没有“序列”或者您无法截断表的情况下,一加表示可用性。我认为这是最好的答案 (2认同)

hum*_*olf 14

2021 年,Postgres 11.12

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

SELECT setval('<table>_<column>_seq', 5);
Run Code Online (Sandbox Code Playgroud)


Anw*_*war 12

为了方便访客而转换自评论

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

ALTER SEQUENCE product_id_seq RESTART WITH 1453;
Run Code Online (Sandbox Code Playgroud)


Cha*_*ary 8

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

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


小智 5

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

句法:

SELECT pg_get_serial_sequence(‘tablename’, ‘ columnname‘);
Run Code Online (Sandbox Code Playgroud)

例子:

SELECT pg_get_serial_sequence('demo', 'autoid');
Run Code Online (Sandbox Code Playgroud)

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

句法:

ALTER SEQUENCE sequenceName RESTART WITH value;
Run Code Online (Sandbox Code Playgroud)

例子:

ALTER SEQUENCE "Demo_autoid_seq" RESTART WITH 1453;
Run Code Online (Sandbox Code Playgroud)


小智 5

要获取序列 ID,请使用

SELECT pg_get_serial_sequence('tableName', 'ColumnName');
Run Code Online (Sandbox Code Playgroud)

这将为您提供 sequensce id 作为tableName_ColumnName_seq

要获取最后的种子号,请使用

select currval(pg_get_serial_sequence('tableName', 'ColumnName'));
Run Code Online (Sandbox Code Playgroud)

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

select currval(tableName_ColumnName_seq);
Run Code Online (Sandbox Code Playgroud)

它会给你最后的种子号

要重置种子数,请使用

ALTER SEQUENCE tableName_ColumnName_seq RESTART WITH 45
Run Code Online (Sandbox Code Playgroud)


Thu*_*ika 5

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

SELECT pg_get_serial_sequence('"SchemaName"."TableName"', 'KeyColumnName'); // output: "SequenceKey"
Run Code Online (Sandbox Code Playgroud)

使用此查询将增量值一一增加,

SELECT nextval('"SchemaName"."SequenceKey"'::regclass); // output 110
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT setval('"SchemaName"."SequenceKey"', 120);
Run Code Online (Sandbox Code Playgroud)

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