OOZOU
与我们联系
返回 TIL 列表
macos

在 DELETE 之后重置 Postgres 数据表的 sequence

October 13, 2020

从数据表删除最近的记录之后,如果自动递增字段的连续性对你很重要,可以重置它的 sequence 计数器。以下面这张 users 数据表的操作为例:

select max(id) from users;

+-----+ 
| max | 
+-----+ 
| 896 | 
+-----+ 
1 rows in set (0.03 sec)

接着,对最近的几行数据执行一些删除操作:

delete from users where created_at > timestamp 'yesterday';
96 rows in set (0.15 sec) 

下一次 insert 时,id 的下一个自动递增值会是 897。使用下面的命令把 users 数据表的 sequence 值减少 96。

select setval('users_id_seq',(select max(id) from users));

+--------+
| setval |
+--------+
| 800    |
+--------+
1 rows in set (0.04 sec)

为什么要重置 sequence?

当你想把 sequence 重新初始化为新的起始值,从而生成一段新的连续序列时,就需要在 Postgres 中重置 sequence。常见的场景包括需要合并多个数据库的数据、变更数据库结构,或是从数据损坏中恢复。通过重置 sequence,你可以确保主键字段持续生成唯一且连续的整数。

认识主键 sequence

主键 sequence 是一种数据库对象,用来为数据表的主键字段生成唯一的整数值。它是关系数据库管理系统的关键组件,确保数据表中的每一行都有唯一的标识。主键 sequence 通常在创建数据表时一并创建,并用来为主键字段生成值。了解主键 sequence 的工作方式,是有效管理数据库的基础。

如何重置 sequence

要在 Postgres 中重置 sequence,可以使用 ALTER SEQUENCE 命令。这个命令可以修改 sequence 生成器的定义,包括起始值、递增量和最大值。重置 sequence 时,你需要指定 sequence 的名称、新的起始值以及递增量。比如,要把名为 “my_sequence” 的 sequence 重置为从 100 开始、每次递增 1,可以使用以下命令:ALTER SEQUENCE my_sequence RESTART WITH 100 INCREMENT BY 1; 另外,你也可以使用 SETVAL 函数把 sequence 重置为特定值。这个函数会把 sequence 的当前值设为指定的值,可以用来把 sequence 重置为新的起始值。例如:SELECT setval('my_sequence', 100);

注意事项与考量

在重置 sequence 之前,务必采取预防措施以避免数据损坏或不一致。以下是几个需要留意的重点:

  • 在对 sequence 做任何修改之前,先确保你已备份数据库。
  • 确认你拥有修改 sequence 所需的权限。
  • 重置 sequence 时要小心,因为它可能影响数据的完整性。
  • 评估重置 sequence 对你的应用和用户的影响。

其他做法

除了使用 ALTER SEQUENCE 命令或 SETVAL 函数之外,Postgres 还有其他重置 sequence 的方法。其中一种做法是先用 pg_get_serial_sequence 函数获取某个字段对应的 sequence 名称,再用 ALTER SEQUENCE 命令重置该 sequence。例如:SELECT pg_get_serial_sequence('my_table', 'id'); ALTER SEQUENCE my_table_id_seq RESTART WITH 100; 另一种做法是使用 SQL 函数把主键 sequence 迁移到新的起始值。当你需要确保 sequence 的值在多个数据表或数据库之间保持连续且唯一时,这种做法特别有用。

更多关于 macos 的笔记

macosAugust 20, 2021

为你的“局部”截图或纯边框图片加上 macOS 风格的阴影

不管你喜不喜欢,macOS 截取完整应用程序窗口的快捷键(⇧- ⌘- 5)默认会在保存的图片周围加上一层淡淡的阴影。当你把截图或图片放进文档时,这能让画面更…

macosNovember 7, 2020

将 SVG 转成 PNG

在 MacOS 上,安装 inkscape(用 brew),然后这样使用:

macosOctober 13, 2020

在 macOS 的 Dock 加入空白间隔来为应用程序分组

打开 term(或同类终端)并粘贴下面这行命令:

有项目想法吗?

我们很想听听您正在做的产品。

开始对话hello@oozou.com
OOZOU Logo

曼谷 · 新加坡 · 香港

X
Facebook
Instagram
LinkedIn
OOZOU Co., Ltd.
548 One City Centre
Ploenchit Road
Bangkok 10330
Thailand
+66 2544 0000
hello@oozou.com

服务

  • Web 开发
  • AI 智能体与生成式 AI
  • 移动应用开发
  • 数据分析与工程
  • UI/UX 与产品设计
  • 数字化转型

公司

  • 关于我们
  • 加入我们
  • 博客
  • 案例研究
  • Today I Learned
  • 联系我们

更多

  • 行业
  • 合作伙伴网络
© 2026 OOZOU. 版权所有。
隐私政策行为准则反贿赂反贪腐政策