一次将标识增量属性添加到现有表

时间:2015-03-13 06:33:24

标签: sql sql-server

我在数据库中有多个表,所有表都有id列,这是主键。

我想要一个脚本,通过该脚本我可以一次向所有表添加标识属性,而不是逐个更改。

1 个答案:

答案 0 :(得分:0)

  

您无法更改现有列的标识。

     

您有两个选择:

  1. 使用identity&创建一个新表删除现有表

  2. 使用identity&创建一个新列删除现有列

  3.   

    但是当这些列有任何约束/关系时,请小心谨慎。

         

    对于已经提出来的表Names

            Drop table Names
            Create table Names
            (
                        ID int,
                        Name varchar(50)
            )
    
            Insert Into Names Values(1,'SQL Server')
            Insert Into Names Values(2,'ASP.NET')
            Insert Into Names Values(4,'C#')
    
      

    在此方法中,您可以保留新的现有数据值   创建了标识列

    CREATE TABLE dbo.Tmp_Names
                (
                Id int NOT NULL IDENTITY (1, 1),
                Name varchar(50) NULL
                )  ON [PRIMARY]
    
    go
    SET IDENTITY_INSERT dbo.Tmp_Names ON
    
    go
    IF EXISTS(SELECT * FROM dbo.Names)
                INSERT INTO dbo.Tmp_Names (Id, Name)
                            SELECT Id, Name FROM dbo.Names TABLOCKX
    
    go
    SET IDENTITY_INSERT dbo.Tmp_Names OFF
    
    go
    DROP TABLE dbo.Names
    
    go
    
    Exec sp_rename 'Tmp_Names', 'Names'
    
      

    在这种方法中,您无法保留现有的数据值   新创建的标识列;

         

    标识列将保存数字序列

    Alter Table Names Add Id_new Int Identity(1,1)
    Go
    
    Alter Table Names Drop Column ID
    Go
    
    Exec sp_rename 'Names.Id_new', 'ID','Column'
    

    Source 1


      

    您可以做的是编写一个快速查询来为您生成SQL   像这样:

    USE INFORMATION_SCHEMA;
    SELECT 
    CONCAT("ALTER TABLE `", TABLE_SCHEMA,"`.`", TABLE_NAME, "` CONVERT TO CHARACTER SET UTF8;") 
    AS MySQLCMD FROM TABLES 
    WHERE TABLE_SCHEMA = "your_schema_goes_here";
    
      

    然后你可以运行它的输出来做你需要的。

    Source 2

    修改

    您可以查看Altering Multiple Tables at once