【问题标题】:Converting int (Auto Increment) primary key to uniqueidentifier primary key in SQL Server 2008在 SQL Server 2008 中将 int(自动增量)主键转换为 uniqueidentifier 主键
【发布时间】:2015-03-21 09:51:59
【问题描述】:

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

由于该表中的数据已经开始泛滥,我必须将INT 更改为Uniqueidentifier,因为int 有限制,一定范围。我想事先处理好这件事。请建议我改变这种情况的方法。

挑战:

  1. 我正在使用实体框架,它使用该表但是,ID (INT,AUTO INCREMENT,PK) 从未使用过。这只是在数据库中。
  2. 数据库正在生产中,因此不能丢失数据。

我有几个问题:

  1. 在多大范围内 int 将开始在数据库中引发错误?
  2. 如果我们继续删除旧记录,它会影响 int 范围吗?或者换句话说,如果我们继续删除旧记录会好吗?

请帮我解决这个问题。

提前致谢

阿莫德

【问题讨论】:

    标签: sql sql-server-2008 primary-key uniqueidentifier


    【解决方案1】:

    在 SQL Server 中,INT 数据类型的 MAX 数为 2,147,483,647。使用 BIGINT 数据类型可以存储的最大数字是 9,223,372,036,854,775,807。所以试试这个。

    ALTER TABLE tablename ALTER COLUMN ID BIGINT
    

    但列不应有任何约束(如外键、索引、默认值、规则等)。

    我在 Google 上搜索的另一个选项是

    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
    

    【讨论】:

      【解决方案2】:

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

      CREATE TABLE dbo.YourTable( ID INT IDENTITY(1,1) ......
      

      使用此设置,当向表中插入行时,SQL Server 将自动为您的表生成连续的 ID。

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

      如果您使用从 1 开始的 INT IDENTITY,并且您每秒插入一行,则需要 66.5 才能达到 20 亿的限制......

      如果您使用从 1 开始的 BIGINT IDENTITY,并且您每秒插入一千行,那么您需要一个令人难以置信的 2.92 亿年才能达到 922 千万亿的限制......

      MSDN Books Online 中阅读有关它的更多信息(包括所有选项)。

      UNIQUEIDENTIFIER 对于程序员来说是一种“方便”的类型 - 但对于您的数据库、您的 DBA 和您的数据库性能来说是一场噩梦,尤其是在用作主键时(以及因此 聚类索引你的桌子)。考虑至少两次您是否要进行该切换!

      【讨论】:

        【解决方案3】:

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

        虽然INT 对于某些大型项目可能不够用,但您可以考虑不从1 开始一个IDENTITY,而是从-2,147,483,648 开始。这将使您的身份价值翻倍。

        如果INT 不够用,你可以考虑BIGINT 数据类型,我想不出任何项目会不满足-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 这么大的范围。

        值得一提的是,如果您在某个列(比如 Col1)上创建聚集索引,那么每个非聚集索引(比如在 Col2 列上)都将被创建,包括 Col1 列。所以这将是更大的开销。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-08-03
          • 1970-01-01
          • 2010-10-15
          • 2011-06-19
          • 2016-06-19
          • 1970-01-01
          • 1970-01-01
          • 2010-09-20
          相关资源
          最近更新 更多