SQL修改表結構之添加主鍵,添加IDENTITY屬性


設計一張表時沒有考慮到主鍵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]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM