在SQL Server 2008中将int(自动递增)主键转换为uniqueidentifier主键

在SQL Server 2008中将int(自动递增)主键转换为uniqueidentifier主键,sql,sql-server-2008,primary-key,uniqueidentifier,Sql,Sql Server 2008,Primary Key,Uniqueidentifier,我对数据库的东西不太熟悉。但我有个问题。我正在为我的一个客户端开发一个应用程序,它使用SQL Server 2008 R2,一个表的主键是INT-IDENTITY 由于此表中的数据已开始泛滥,我必须将INT更改为Uniqueidentifier,因为INT有一定范围的限制。我想先处理好这件事。请建议我如何改变这一点 挑战: 我使用的是实体框架,它使用该表,然而,ID(INT,AUTO INCREMENT,PK)从未被使用过。这只是在数据库中 数据库正在生产中,因此不能丢失数据 我有几个问题: i

我对数据库的东西不太熟悉。但我有个问题。我正在为我的一个客户端开发一个应用程序,它使用SQL Server 2008 R2,一个表的主键是
INT-IDENTITY

由于此表中的数据已开始泛滥,我必须将
INT
更改为
Uniqueidentifier
,因为INT有一定范围的限制。我想先处理好这件事。请建议我如何改变这一点

挑战:

  • 我使用的是实体框架,它使用该表,然而,
    ID
    (INT,AUTO INCREMENT,PK)从未被使用过。这只是在数据库中
  • 数据库正在生产中,因此不能丢失数据
  • 我有几个问题:

  • int将在数据库中引发错误的最大范围是多少
  • 如果我们继续删除较旧的记录,它会影响int范围吗?换句话说,如果我们继续删除较旧的记录,它会好吗
  • 请帮我做这个

    提前谢谢


    在SQL Server中,INT数据类型的最大编号为2147483647。使用BIGINT数据类型可以存储的最大数字是9223372036854775807。因此,请尝试此方法

    ALTER TABLE tablename ALTER COLUMN ID BIGINT
    
    但是列不应该有任何约束(比如外键、索引、默认值、规则等)

    我在谷歌搜索的另一个选项是

    1 - create a new bigint column in the table
    2 - update that new column with the values from the int column
    3 - delete the int column
    4 - rename the bigint column
    

    使用
    IDENTITY
    属性定义类型为
    INT
    (或
    SMALLINT、TINYINT、BIGINT
    )的列:

    CREATE TABLE dbo.YourTable( ID INT IDENTITY(1,1) ......
    
    通过此设置,SQL Server将在表中插入行时自动为表生成连续的ID

    使用类型
    INT
    ,从1开始,您可以得到超过20亿行的,这对于绝大多数情况来说应该足够了。有了
    BIGINT
    ,你大概可以得到922万亿(922,15个零-922.2万亿)-足够你用了吗

    如果使用从1开始的
    INT标识
    ,并且每秒插入一行,则需要66.5年才能达到20亿的上限

    如果从1开始使用
    BIGINT标识
    ,并且每秒插入1000行,那么在达到922万亿次极限之前,需要一个令人难以置信的2.92亿年

    在中阅读更多关于它的信息(包括所有选项)


    UNIQUEIDENTIFIER
    对于程序员来说是一种“方便”的类型,但对于您的数据库、DBA和数据库性能来说却是一场噩梦,尤其是当它用作主键时(因此也是表的集群索引)。思考至少两次是否要切换

    事实上,这是一个大话题。为数据选择合适类型的一个主要方面是大小
    INT
    数据类型需要4字节,
    BIGINT
    8字节,
    UNIQUEIDENTIFIER
    需要16字节

    <> P> >代码> int <代码>对于某些大型项目可能不充分,您可以考虑从“代码> 1”/代码>中开始标识,但不应从<代码> -2147483648 < /C> >开始。这将使您的标识值加倍

    如果<代码> int <代码>是不够的,你可以考虑<代码> BIGINT < /C>数据类型,我想不出任何这样一个巨大的范围不能满足的项目<代码> -922337203685477580到922337203685477580 < /C> 值得一提的是,如果您在某个列(比如Col1)上创建聚集索引,那么将创建包括Col1列在内的每个非聚集索引(比如Col2列)。所以这将是更大的开销

    但是
    UNIQUEIDENTIFIERS
    在分布式解决方案中非常有用,您可以在多个解决方案中获得保证的唯一值。您还可以在任何地方生成
    GUID
    ,并且您知道生成的值在时间和空间上都是唯一的

    作为最佳实践,您应该为列指定尽可能最小的数据类型