---
title: "在 DELETE 之後重設 Postgres 資料表的 sequence"
description: "從資料表刪除最近的紀錄之後，如果自動遞增欄位的連續性對你很重要，可以重設它的 sequence 計數器。以下面這張 users 資料表的操作為例："
canonical: https://oozou.com/til/reset-postgres-table-sequence-after-delete-66
locale: zh-Hant
date: 2020-10-13
topic: macos
---

# 在 DELETE 之後重設 Postgres 資料表的 sequence

> 從資料表刪除最近的紀錄之後，如果自動遞增欄位的連續性對你很重要，可以重設它的 sequence 計數器。以下面這張 users 資料表的操作為例：

Published: 2020-10-13 · Topic: [macos](https://oozou.com/zh-Hant/til-topics/macos) ([markdown](https://oozou.com/zh-Hant/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-Hant/contact

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