| 方法 | 語法 | 效果 | 適用場景 | 資料保留 |
|---|---|---|---|---|
| TRUNCATE TABLE | TRUNCATE TABLE TableName | 刪除所有資料並重置種子為定義初始值 | 測試環境清空表、快速重置 | ❌ 全刪 |
| DBCC CHECKIDENT | DBCC CHECKIDENT ('TableName', RESEED, 0) | 保留資料,將下一個身分識別值設為 1(新種子+增量) | 保留資料重新編號、修復種子跳號 | ✅ 保留 |
| SET IDENTITY_INSERT | SET IDENTITY_INSERT TableName ON/OFF | 允許/禁止顯式指定身分識別欄位值插入 | 資料移轉保留原主鍵、合併資料指定 ID | ✅ 保留 |
TRUNCATE TABLE dbo.TestTable;
-- 等同於:DELETE + 重置身分識別 + 不記錄逐行日誌(極快)
-- 限制:有外鍵參考時無法執行、不觸發 DELETE 觸發器
-- 重置為 0,下一筆插入將為 1(假設種子 1、增量 1)
DBCC CHECKIDENT ('dbo.TestTable', RESEED, 0);
-- 查看目前身分識別值狀態
DBCC CHECKIDENT ('dbo.TestTable');
-- 返回:目前身分識別值、資料行值、下一個值
-- 指定新種子(如從 1000 開始)
DBCC CHECKIDENT ('dbo.TestTable', RESEED, 1000);
關鍵行為:
RESEED, 0後,若表有資料且最大 ID > 0,下一筆插入會嘗試使用 1 → 衝突。建議搭配:RESEED, (SELECT MAX(ID) FROM Table)或先清空資料。
-- 允許顯式插入身分識別欄位
SET IDENTITY_INSERT dbo.TestTable ON;
INSERT INTO dbo.TestTable (ID, Name) VALUES (999, '指定ID資料');
-- 插入完畢必須關閉
SET IDENTITY_INSERT dbo.TestTable OFF;
-- 限制:同一時間同一資料庫僅允許一張表開啟 IDENTITY_INSERT
TRUNCATE TABLE dbo.TestTable; -- 最快、最乾淨
DECLARE @maxID INT = (SELECT MAX(ID) FROM dbo.TestTable);
DBCC CHECKIDENT ('dbo.TestTable', RESEED, @maxID);
-- 下一筆插入將為 @maxID + 1
SET IDENTITY_INSERT dbo.TargetTable ON;
INSERT INTO dbo.TargetTable (ID, Col1, Col2)
SELECT ID, Col1, Col2 FROM dbo.SourceTable
WHERE ID NOT IN (SELECT ID FROM dbo.TargetTable);
SET IDENTITY_INSERT dbo.TargetTable OFF;
DELETE FROM Table 不會重置身分識別種子 → 使用 TRUNCATE 或 DBCC CHECKIDENTDBCC CHECKIDENT RESEED, 0 後直接插入資料 → 若表有殘留資料會主鍵衝突SET IDENTITY_INSERT OFF → 後續隱性插入失敗、鎖定該表IDENT_CURRENT()