zoukankan      html  css  js  c++  java
  • Sql Server中如何删除字段的自增标识

    今天处理网页权限问题时,发现桌面应用程序控制的权限和网页权限对不上
    分析之后发现两个项目不是取一个数据库的数据,它们只是通过一张用户权限表来控制权限
    最终对比发现两张表中权限id不一致,查看项目发现他们都是取id来控制(id都是自增,醉了,为啥不加标识列,用标识列来控制),所以导致权限控制出错
    为了解决这个问题,最后的方案是————以桌面应用程序对应的数据库为基础数据库,在网页对应的数据库中去同步这个数据
    因为id都为自增 所以要去掉网页对应的数据库的这张表id的自增
    那么问题来了,如何用sql语句去掉表中字段自增标识
    语句如下:

    --创建一个普通列
    ALTER TABLE dbo.表名 ADD 列名 INT 
    GO
    --将自增列数据插入新建列名中
    UPDATE dbo.表名 SET 列名 = 自增列名;
    GO
    --删除自增列
    ALTER TABLE dbo.表名 DROP COLUMN 自增列名 
    GO
    --修改增加的列名为自增列的列明
    EXEC sys.sp_rename @objname = N'表名.列名', 
    @newname = '自增列名', 
    @objtype = 'COLUMN'

    运行时发现这张表有外键
    那么问题来了,一张表有外键或者主键时,如何用sql语句去掉表中字段自增标识
    语句如下(多个主键,多个外键不行):

    --创建一个普通列
    IF NOT  EXISTS ( SELECT  * FROM    sys.columns WHERE   object_id = OBJECT_ID('Table_1') AND name = 'id1') 
    BEGIN
    ALTER TABLE dbo.Table_1 ADD    id1 INT 
    END 
    GO 
    
    IF EXISTS (SELECT COLUMNPROPERTY( OBJECT_ID('Table_1'),'id','IsIdentity'))
    BEGIN
    DECLARE @name NVARCHAR(100)--外键名
    DECLARE @id NVARCHAR(100)--主键id
    DECLARE @name1 NVARCHAR(100)--主键名
    DECLARE @sql VARCHAR(MAX)
    
    --删除外键
    IF EXISTS ( SELECT name from sys.foreign_key_columns f join sys.objects o on f.constraint_object_id=o.object_id where f.parent_object_id=object_id('Table_1'))
    BEGIN
    SET @name= (SELECT name from sys.foreign_key_columns f join sys.objects o on f.constraint_object_id=o.object_id where f.parent_object_id=object_id('Table_1'))
    SET @sql='alter table Table_1 drop constraint '+ @name 
    EXEC(@sql)
    END 
    
    --删除主键
    IF EXISTS ( SELECT CONSTRAINT_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='Table_1')
    BEGIN
    SELECT @name1=CONSTRAINT_NAME,@id=COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='Table_1'
    END 
    SET @sql='Alter table  Table_1  Drop Constraint '+ @name1 
    PRINT @sql
    EXEC(@sql)
    
    --将自增列数据插入新建列名中
    UPDATE dbo.Table_1 SET id1 = id
    
    --删除自增列
    ALTER TABLE dbo.Table_1 DROP COLUMN ID 
    
    --修改增加的列名为自增列的列明
    EXEC sys.sp_rename @objname = N'Table_1.id1', 
        @newname = 'id', 
        @objtype = 'COLUMN' 
    
    --重新增加主键
    IF ISNULL(@name1,'')<>''
    BEGIN
    SET @sql='ALTER table Table_1 add CONSTRAINT '+ @name+' Primary  Key('+@id+') '
    EXEC(@sql)
    END 
    
    --重新增加外键
    IF ISNULL(@name,'')<>''
    BEGIN
    SET @sql='ALTER table Table_1 add CONSTRAINT '+ @name+' foreign key(id) references Table_2('+@id+') '
    EXEC(@sql)
    END
    
    END 
    GO 
    
    --是否存在一个普通列
    IF EXISTS ( SELECT  * FROM    sys.columns WHERE   object_id = OBJECT_ID('Table_1') AND name = 'id1') 
    BEGIN
    ALTER TABLE dbo.Table_1 DROP COLUMN id1  
    END 
    GO 
  • 相关阅读:
    80年代的兄弟,你会什么?
    设计模式单件模式
    大冒险 这注定是部史诗级的探索。。。
    关于重构JS前端框架的失败经验(顺便怀念那些死去的代码)
    JDBC连接数据库类(主要用于存储过程)
    ActiveRecord学习(六):总结
    ASP.NET中常用的文件上传下载方法
    [整理]ASP.NET2.0新特性概述
    关于NHibernate中one to many 的问题
    关注06德国世界杯:比赛日程表
  • 原文地址:https://www.cnblogs.com/summert/p/7000090.html
Copyright © 2011-2022 走看看