---
title: "在 DELETE 之后重置 Postgres 数据表的 sequence"
description: "从数据表删除最近的记录之后，如果自动递增字段的连续性对你很重要，可以重置它的 sequence 计数器。以下面这张 users 数据表的操作为例："
canonical: https://oozou.com/til/reset-postgres-table-sequence-after-delete-66
locale: zh-Hans
date: 2020-10-13
topic: macos
---

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

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

Published: 2020-10-13 · Topic: [macos](https://oozou.com/zh-Hans/til-topics/macos) ([markdown](https://oozou.com/zh-Hans/til-topics/macos.md))

从数据表删除最近的记录之后，如果自动递增字段的连续性对你很重要，可以重置它的 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 的值在多个数据表或数据库之间保持连续且唯一时，这种做法特别有用。

---

Contact OOZOU: hello@oozou.com · +66 2544 0000 · https://oozou.com/zh-Hans/contact

More for AI agents: https://oozou.com/llms.txt · every page has a markdown twin at its URL plus ".md"
