SQL Server:将PK类型从uniqueidentifier更改为int

时间:2015-09-28 21:47:18

标签: sql sql-server sql-server-2014

我为所有表设计了一个主键类型为uniqueidentifier的数据库。它有50个表和现有数据。然后,我知道这是一个坏主意。我想从int更改为uniqueidentifier pk类型。

我该怎么办?如何移动外键?

2 个答案:

答案 0 :(得分:0)

要采取的一般步骤是(链接到有关使用SQL Server执行这些步骤的MSDN信息):

  1. 删除当前的主键约束 - Delete Primary Key
  2. 更改表格以删除唯一标识符字段并创建新的整数字段 - Alter Table
  3. 在新的整数字段Create Primary Key
  4. 上创建新的主键

答案 1 :(得分:0)

刚刚完成了一个脚本,在几个表上进行了测试并且工作正常,在生产环境中执行它之前自己测试一下。

脚本执行以下操作。

  1. 查找主键具有数据类型Uniqueidentifier的所有列。
  2. 删除主键约束。
  3. 删除Uniqueidentifier列。
  4. 添加INT列,其标识以种子值1和增量1开头。
  5. 将该列设为该表中的主键列。
  6. declare @table SYSNAME,@Schema SYSNAME 
          , @PkColumn SYSNAME, @ContName SYSNAME
          ,@Sql nvarchar(max)
    
    
    DECLARE db_cursor CURSOR LOCAL FORWARD_ONLY FOR  
    SELECT OBJECT_NAME(O.object_id) AS ConstraintName
        ,SCHEMA_NAME(O.schema_id) AS SchemaName
        ,OBJECT_NAME(O.parent_object_id) AS TableName
        ,c.name ColumName
    FROM sys.objects o 
    inner join sys.columns c ON o.parent_object_id = c.object_id
    inner join sys.types   t ON c.user_type_id = t.user_type_id
    WHERE o.type_desc = 'PRIMARY_KEY_CONSTRAINT'
    and   t.name = 'uniqueidentifier'
    
    Open db_cursor
    fetch next from db_cursor into @ContName , @Schema , @table, @PkColumn
    
    while (@@FETCH_STATUS = 0)
    BEGIN
    
       SET @Sql= 'ALTER TABLE ' + QUOTENAME(@Schema) +'.'+ QUOTENAME(@table) 
                  + ' DROP CONSTRAINT ' + QUOTENAME(@ContName)
    
        Exec sp_executesql @Sql
    
    
       SET @Sql= 'ALTER TABLE ' + QUOTENAME(@Schema) +'.'+ QUOTENAME(@table) 
                  + ' DROP COLUMN ' + QUOTENAME(@PkColumn)
    
       Exec sp_executesql @Sql
    
    
       SET @Sql= 'ALTER TABLE ' + QUOTENAME(@Schema) +'.'+ QUOTENAME(@table) 
                  + ' ADD  ' + QUOTENAME(@PkColumn) 
                  + ' INT NOT NULL IDENTITY(1,1) '
    
       Exec sp_executesql @Sql
    
      SET @Sql= 'ALTER TABLE  ' + QUOTENAME(@Schema) +'.'+ QUOTENAME(@table) 
               + ' ADD CONSTRAINT '+ QUOTENAME(@table+'_'+ @PkColumn)
               + ' PRIMARY KEY ('+QUOTENAME(@PkColumn)+')'
    
      Exec sp_executesql @Sql
    
      fetch next from db_cursor into @ContName , @Schema , @table, @PkColumn
    
    END
    
    Close db_cursor
    deallocate db_cursor