在 DELETE 之後重設 Postgres 資料表的 sequence
從資料表刪除最近的紀錄之後,如果自動遞增欄位的連續性對你很重要,可以重設它的 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 的值在多個資料表或資料庫之間保持連續且唯一時,這種做法特別有用。