CurrentDb.Execute "DROP TABLE [TableName]"
strSql = "DELETE * FROM [TableName] WHERE [lngNodeId] <> 1"
CurrentDb.Execute strSql
Access 的 AutoNumber 欄位在刪除記錄後**不會回收號碼**。例如:
核心邏輯:複製結構與資料 → 刪除舊表 → 重建同名表 → 複製回資料,即可清除自動編號記憶。
' 1. 將需保留的資料複製到暫存表 (同時移除自動編號記憶)
strSql = "SELECT tblTestTree2.* INTO [tblTmp] FROM [OldTable] WHERE [lngNodeId] = 1"
CurrentDb.Execute strSql
' 2. 刪除原資料表
CurrentDb.Execute "DROP TABLE [OldTable]"
' 3. 從暫存表重建同名資料表
strSql = "SELECT * INTO [OldTable] FROM [tblTmp]"
CurrentDb.Execute strSql
' 4. 清理暫存表
CurrentDb.Execute "DROP TABLE [tblTmp]"
SELECT ... INTO [NewTable] 會建立**新資料表**,自動編號欄位重新計算種子值。DROP TABLE 徹底移除舊表結構與中繼資料(含自動編號計數器)。| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 重建資料表 (本文) | 徹底重置、無需壓縮修復 | 需處理關聯、索引、權限重建 | 開發期、資料量中小、結構簡單 |
| 壓縮與修復資料庫 | 一次清理所有表自動編號 | 需獨佔資料庫、耗時、風險較高 | 維護期、整庫優化 |
| ALTER TABLE ALTER COLUMN COUNTER(1,1) | 語法簡單 (ACE/Jet 4.0+) | 需資料庫獨佔、不支援 MDB 早期版本 | 單表快速重置、支援 SQL 執行 |
SELECT INTO 不複製索引,需額外 CREATE INDEX。DAO 操作 Access 時,自動編號重置是常見痛點。「複製→刪除→重建」雖顯笨拙,卻是最穩健、相容性最佳的方案。搭配適當的錯誤處理與交易控制,即可在應用程式中優雅解決此問題。