程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 將已有數據的表的[ID]字段變更為自增長

將已有數據的表的[ID]字段變更為自增長

編輯:關於SqlServer

表上創建好了PK,卻發現了更大的麻煩:忘記將[ID] 字段設置成IDENTITY了:(

那可是幾百張表哪!那就編寫SQL腳本來搞定吧。

可是,這事沒有想象中那麼容易:ALTER TABLE不支持將某字段變更為IDENTITY (注:MS SQL Mobile是支持此語法的)

而且,若該字段上有PK、Index、Constrains等,必須先刪除才能DROP COLUMN.

注:

1)下面的代碼只處理了單個表的。整個DB中所有表,或者選擇一批表進行處理,是件很容易的事,讀者自己搞定吧。

2)這段代碼只是示例,作了很多簡化與假定:

- 簡化:不判斷是否存在特定名稱的PK;

- 假定:[ID]字段上沒有其它約束

- 假定:目標表的PK固定為PK_#Table#,目標字段為[ID]

- 假定:之前的ID數據沒有用(否則應該使用Move—>Rebuild-->MoveBack的方式)

----獻上代碼--------------------------------------

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go 
     
-- ============================================= 
-- Author:      Yew 
-- Create date: 2011-06-12 
-- Description: 為某表設置IDENTITY(on ID) 
-- ============================================= 
ALTER PROCEDURE [TOOL].[sp_Table_SetIdentity] 
     @Table varchar(100) 
    ,@Schema    varchar(100) 
AS
BEGIN
    DECLARE @vSQL nvarchar(max) 
     
    -- drop PK on [ID] 
    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) 
     
    -- rebuild IDENTITY column 
    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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved