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

服務

  • Web 開發
  • AI 代理人與生成式 AI
  • 行動應用開發
  • 數據分析與工程
  • UI/UX 與產品設計
  • 數位轉型

公司

  • 關於我們
  • 職涯
  • 部落格
  • 案例研究
  • Today I Learned
  • 聯繫我們

更多

  • 產業
  • 合作夥伴網絡
© 2026 OOZOU. 版權所有。
隱私政策行為準則反賄賂反貪腐政策