IDENTITY(1,1)ALTER TABLE ... ALTER COLUMN 不支援加入 IDENTITY⚠ 前提假設:
[ID] 上無其他約束 (除 PK 外)PK_#Table#CREATE PROCEDURE [TOOL].[sp_Table_SetIdentity]
@Table VARCHAR(100),
@Schema VARCHAR(100)
AS
BEGIN
DECLARE @vSQL NVARCHAR(MAX);
-- 1. 移除 PK 約束
SET @vSQL = N'ALTER TABLE #Schema#.#Table# DROP CONSTRAINT PK_#Table#;';
SET @vSQL = REPLACE(@vSQL, '#Table#', @Table);
SET @vSQL = REPLACE(@vSQL, '#Schema#', @Schema);
PRINT @vSQL;
EXEC (@vSQL);
-- 2. 重建 IDENTITY 欄位 + 重建 PK
SET @vSQL = N'
ALTER TABLE #Schema#.#Table# DROP COLUMN [ID];
ALTER TABLE #Schema#.#Table# ADD [ID] INT IDENTITY(1,1) NOT NULL;
ALTER TABLE [#Schema#].[#Table#]
ADD CONSTRAINT [PK_#Table#] PRIMARY KEY CLUSTERED
( [ID] ASC )
WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = ON, ONLINE = OFF)
ON [PRIMARY];';
SET @vSQL = REPLACE(@vSQL, '#Table#', @Table);
SET @vSQL = REPLACE(@vSQL, '#Schema#', @Schema);
PRINT @vSQL;
EXEC (@vSQL);
END
原始表結構 步驟 1: DROP PK 步驟 2: DROP COLUMN ID
[ID] INT PK ───► [ID] INT (無約束) ───► (無 ID 欄位)
│
▼
步驟 3: ADD ID INT IDENTITY
步驟 4: ADD PK
│
▼
最終表結構: [ID] INT IDENTITY(1,1) PK CLUSTERED
| 風險 | 影響 | 緩解/替代 |
|---|---|---|
| 資料遺失 | 原 ID 值消失,外來鍵關聯斷裂 | 先建立對應表保存舊 ID,或用 SWITCH 分區技術 |
| 鎖定時間長 | 大表 DROP COLUMN 需 Schema Modification Lock | 維護時段、分批處理、企業版 ONLINE=ON |
| 觸發器/權限遺失 | DROP COLUMN 會移除相依物件 | 腳本化觸發器/權限,事後重建 |
-- 1. 新增暫存身分識別欄
ALTER TABLE dbo.MyTable ADD NewID INT IDENTITY(1,1);
-- 2. 更新外來鍵參考表 (若有)
-- UPDATE ChildTable SET ParentID = p.NewID FROM ParentTable p WHERE ChildTable.ParentID = p.OldID;
-- 3. 移除舊 PK、舊 ID
ALTER TABLE dbo.MyTable DROP CONSTRAINT PK_MyTable;
ALTER TABLE dbo.MyTable DROP COLUMN OldID;
-- 4. 重命名 NewID → ID
EXEC sp_rename 'dbo.MyTable.NewID', 'ID', 'COLUMN';
-- 5. 重建 PK
ALTER TABLE dbo.MyTable ADD CONSTRAINT PK_MyTable PRIMARY KEY CLUSTERED (ID);