代码之家  ›  专栏  ›  技术社区  ›  anakic

SQL Server将pk类型从int更改为uniqueidentifier

  •  5
  • anakic  · 技术社区  · 15 年前

    我需要将表中主键列的类型从int更改为guid。数据库已经有我不想丢失的数据,还有外键要考虑。有没有一种无痛的方法可以做到这一点,或者我需要手动通过一个大的**脚本来做到这一点?:)我很感谢你的建议。

    2 回复  |  直到 9 年前
        1
  •  5
  •   KM.    15 年前

    你必须用很难的方法,使用脚本:

    0)进入单用户模式
    1)将新的guid列添加到主表中,并填充它。
    2)将新的FK列添加到每个子表中,并用更新自填充这些子表。

    UPDATE c
        SET FKcolumn=p.NewGuid
        FROM ChildTable             c
            INNER JOIN ParentTable  p ON p.OldIntID=c.OldIntId
    

    3)删除现有的int fks
    4)删除旧的int列
    5)在guid列上添加新的fks
    6)退出单用户模式

    您应该能够让SQL Server Management Studio生成用于添加和删除列和键的脚本。只需在SSMS中进行更改,然后单击“生成更改脚本”工具栏图标,就可以将代码剪切并粘贴到文本文件中。

        2
  •  0
  •   Hrvoje Matic    9 年前
    1. 使用数据库上的“生成脚本”选项创建“删除/创建约束和索引”(使用高级按钮优化向导)。 运行创建的SQL脚本的一部分以删除索引和约束。
    2. 创建一个助手函数和过程,如下所示:

      CREATE FUNCTION [dbo].[GuidFromHash]
      (
          @Input nvarchar(MAX)
      )
      RETURNS nvarchar(MAX)
      AS
      BEGIN
          RETURN LOWER(SUBSTRING(@Input, 1,8)+'-'+SUBSTRING(@Input, 9,4)+'-'+SUBSTRING(@Input, 13,4)+'-'+SUBSTRING(@Input, 17,4)+'-'+SUBSTRING(@Input, 21,12))
      END
      
      CREATE PROCEDURE [dbo].[bigIntToGuid]
      (
          @table varchar(50),
          @column varchar(50)
      )
      AS
      DECLARE @SQL VARCHAR(MAX)
      
      SET @SQL='UPDATE @Table SET @Column=dbo.HashToGuid(''cc''+CONVERT(VARCHAR, HASHBYTES(''MD5'',LTRIM(@Column)),2))'
      SET @SQL=REPLACE(@SQL,'@Table',@Table)
      SET @SQL=REPLACE(@SQL,'@Column',@Column)
      EXEC(@SQL)
      
      SET @SQL='SELECT * FROM @Table'
      SET @SQL=REPLACE(@SQL,'@Table',@Table)
      SET @SQL=REPLACE(@SQL,'@Column',@Column)
      EXEC(@SQL)
      
    3. 现在每一张桌子都有手工操作:

      1. 在设计器中打开表(SQL Management Studio或其他工具)
      2. 将列的bigint类型更改为varchar(50)
      3. 执行“exec biginttoguid”“mytable”“mybigintcolumn”
      4. 返回到表设计器将列类型更改为“uniqueidentifier”
      5. 可以选择添加默认值:newid()和/或将列设置为主键
    4. 打开在步骤1中创建的SQL生成的脚本
    5. 只选择脚本的一部分用于创建约束和索引,然后执行它

    此方法确保将int转换为guid并保持数据完整性。