2013-09-25 61 views

回答

3

您的表必須從頭開始重建,這是不可能的AUTO_INCREMENT分配給現有的表。試試這個腳本,它將使用auto_increment爲你建立一個表格,將舊錶格中的所有數據傳輸到新表格,刪除舊錶格並將新表格重新命名爲舊錶格。

只要確保您的數據與auto_increment屬性兼容!

BEGIN TRANSACTION 
SET QUOTED_IDENTIFIER ON 
SET ARITHABORT ON 
SET NUMERIC_ROUNDABORT OFF 
SET CONCAT_NULL_YIELDS_NULL ON 
SET ANSI_NULLS ON 
SET ANSI_PADDING ON 
SET ANSI_WARNINGS ON 
COMMIT 
BEGIN TRANSACTION 
GO 
CREATE TABLE dbo.Tmp_schema_version 
    (
    version int NULL, 
    datetime datetime NULL, 
    comments nvarchar(150) NULL, 
    id int NOT NULL IDENTITY (1, 1) 
    ) ON [PRIMARY] 
GO 
ALTER TABLE dbo.Tmp_schema_version SET (LOCK_ESCALATION = TABLE) 
GO 
SET IDENTITY_INSERT dbo.Tmp_schema_version ON 
GO 
IF EXISTS(SELECT * FROM dbo.schema_version) 
    EXEC('INSERT INTO dbo.Tmp_schema_version (version, datetime, comments, id) 
     SELECT version, datetime, comments, id FROM dbo.schema_version WITH (HOLDLOCK TABLOCKX)') 
GO 
SET IDENTITY_INSERT dbo.Tmp_schema_version OFF 
GO 
DROP TABLE dbo.schema_version 
GO 
EXECUTE sp_rename N'dbo.Tmp_schema_version', N'schema_version', 'OBJECT' 
GO 
ALTER TABLE dbo.schema_version ADD CONSTRAINT 
    PK_schema_version PRIMARY KEY CLUSTERED 
    (
    id 
    ) WITH(STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 

GO 
COMMIT 
+0

謝謝你的幫助...反正沒有足夠的數據...所以我放棄了桌子並用身份(1,1)主鍵重新創建... tc .. – Mahib

0

這與@Dieter Gobeyn的解決方案几乎類似,我後面跟着。

創建具有自動遞增的臨時表上

CREATE TABLE [dbo].[schema_version_new](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [Version] [int] NULL, 
    [DateTime] [datetime] NULL, 
    [Comments] [nvarchar](150) NULL, 

    PRIMARY KEY CLUSTERED 
    (
     [ID] ASC 
    ) 
    ) ON [PRIMARY] 

GO 

複製一切從舊錶到新創建的一個;我們從舊錶中故意留下了ID,並且我們在新表上放置了自動增量ID,因此不需要將ID放在那裏。如果我們需要保留舊錶的ID,那麼我們需要「SET IDENTITY_INSERT dbo.schema_version_new OFF」,在插入行時包含ID,插入後我們再次將identity_insert變爲「SET IDENTITY_INSERT dbo.schema_version_new ON」。對於新的插入它會得到自動ID。

INSERT INTO [schema_version_new]([Version], [Datetime], [Comments]) 
    SELECT [Version], [Datetime], [Comments] FROM [schema_version] 

丟掉舊桌子。

DROP TABLE [dbo].[schema_version] 
GO 

將新表重命名爲舊錶的名稱。

EXECUTE sp_rename N'dbo.schema_version_new', N'schema_version', 'OBJECT' 
GO