設計一張表時沒有考慮到主鍵Id及自增長,現又需要,原腳本:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[ForbiddenType]( [Id] [int] NOT NULL, [Type] [nvarchar](100) NOT NULL ) ON [PRIMARY] GO EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'屏蔽類型(0全部)' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'ForbiddenType', @level2type=N'COLUMN',@level2name=N'Type' GO
並初始化了表數據:
INSERT [dbo].[ForbiddenType] ([Id], [Type]) VALUES (0, N'--All--') INSERT [dbo].[ForbiddenType] ([Id], [Type]) VALUES (1, N'用戶評論(客戶端展示)') INSERT [dbo].[ForbiddenType] ([Id], [Type]) VALUES (2, N'后台編輯(服務端)')
在此條件下實現后台操作Type與Type對應的值可編輯,要重新修改Id字段屬性;
要成為IDENTITY標識列的列只能先被刪除然后再添加同名列
----刪除列 alter table tablename drop COLUMN id GO ----添加IDENTITY列 alter table tablename add id int identity(1,1) GO ----設置IDENTITY列為主鍵 alter table tablename add constraint [PK_tablename] PRIMARY KEY CLUSTERED ([id])
但是這樣做會改變主鍵字段在表中的順序
如果不想改變表中主鍵的位置,有兩種思路,一是刪除表后重建;一是不刪除,將字段逐個刪除再依次添加字段:
看代碼:
--修改表ForbiddenType IF EXISTS ( SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[ForbiddenType]') AND OBJECTPROPERTY(id ,N'IsUserTable') = 1 ) DROP TABLE [dbo].[ForbiddenType] GO CREATE TABLE [dbo].[ForbiddenType] ( [Id] [int] NOT NULL IDENTITY(1 ,1) ,[TypeId] INT NOT NULL ,[Type] [nvarchar](100) NOT NULL , ) ON [PRIMARY] -- TypeId字段說明 EXEC sys.sp_addextendedproperty @name=N'MS_Description' ,@value=N'屏蔽類型對應值(類型對應Id)' ,@level0type=N'SCHEMA' ,@level0name=N'dbo' ,@level1type=N'TABLE' ,@level1name=N'ForbiddenType' ,@level2type=N'COLUMN' ,@level2name=N'TypeId' -- Type字段說明 EXEC sys.sp_addextendedproperty @name=N'MS_Description' ,@value=N'屏蔽類型' ,@level0type=N'SCHEMA' ,@level0name=N'dbo' ,@level1type=N'TABLE' ,@level1name=N'ForbiddenType' ,@level2type=N'COLUMN' ,@level2name=N'Type' INSERT INTO [dbo].[ForbiddenType] ( TypeId ,TYPE ) VALUES ( 1 ,'用戶評論(客戶端展示)' ) INSERT INTO [dbo].[ForbiddenType] ( TypeId ,TYPE ) VALUES ( 2 ,'后台編輯(服務端)' ) GO
TRUNCATE TABLE ForbiddenType --清空數據庫表數據 --刪除表中列Type的描述屬性: EXEC sp_dropextendedproperty 'MS_Description', 'SCHEMA', dbo, 'TABLE', 'ForbiddenType', 'COLUMN', TYPE GO ALTER TABLE ForbiddenType DROP COLUMN Id GO --添加自增的Id列並設為主鍵 ALTER TABLE ForbiddenType ADD [IDs] [int] NOT NULL IDENTITY(1, 1) EXEC sp_rename 'ForbiddenType.[IDs]', 'Id', 'COLUMN'; ALTER TABLE ForbiddenType ADD CONSTRAINT [PK_ForbiddenType] PRIMARY KEY CLUSTERED([Id]) ALTER TABLE ForbiddenType ADD [TypeId] [int] NOT NULL GO ALTER TABLE ForbiddenType DROP COLUMN TYPE ALTER TABLE ForbiddenType ADD TYPE [nvarchar](100) NOT NULL GO EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = N'屏蔽類型對應值(類型對應Id)', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'ForbiddenType', @level2type = N'COLUMN', @level2name = N'TypeId' -- Type字段說明 EXEC sys.sp_addextendedproperty @name = N'MS_Description', @value = N'屏蔽類型', @level0type = N'SCHEMA', @level0name = N'dbo', @level1type = N'TABLE', @level1name = N'ForbiddenType', @level2type = N'COLUMN', @level2name = N'Type' GO INSERT INTO [dbo].[ForbiddenType] ( TypeId, TYPE ) VALUES ( 1, '用戶評論(客戶端展示)' ) INSERT INTO [dbo].[ForbiddenType] ( TypeId, TYPE ) VALUES ( 2, '后台編輯(服務端)' )
對於一張表,想要添加與刪除主鍵,可參見下面
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[主鍵名]') and OBJECTPROPERTY(object_id(N'[列名]'), N'IsPrimaryKey') = 1) ALTER TABLE 表名 DROP CONSTRAINT [主鍵名] ALTER TABLE 表名 ADD CONSTRAINT [新主鍵名] PRIMARY KEY ([列名]) if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[PK_orders]') and OBJECTPROPERTY(OBJECT_ID(N'dbo.[orders].[pi_no]'), N'IsPrimaryKey') = 1) ALTER TABLE orders DROP CONSTRAINT [PK_orders] ALTER TABLE orders ADD CONSTRAINT [PK_orders] PRIMARY KEY ([form_no]) ON [PRIMARY]