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

时间:2015-03-21 09:52:00

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

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

由于数据已在此表中开始泛滥,我必须将INT更改为Uniqueidentifier,因为int具有限制,某个范围。我想事先照顾好这个。请建议我改变它的方式。

挑战:

  1. 我正在使用Entity Framework,但是从未使用ID(INT,AUTO INCREMENT,PK)。这只是在数据库中。
  2. 数据库正在生产中,因此无法承担丢失的数据。
  3. 我几乎没有问题:

    1. int会在什么范围内开始在数据库中抛出错误?
    2. 如果我们继续删除旧记录会影响int范围或者换句话说如果我们继续删除旧记录就可以了吗?
    3. 请帮我解决这个问题。

      提前致谢

      阿莫德

3 个答案:

答案 0 :(得分:0)

在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

答案 1 :(得分:0)

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

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

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

类型为INT,从1开始,您可以获得超过20亿的行 - 这对于绝大多数情况来说应该足够了。使用BIGINT,您可以获得大约 922千兆(922,包含15个零 - 9' 220&#39,000亿) - 足够你?

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

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

MSDN Books Online

中详细了解它(包括所有选项)

UNIQUEIDENTIFIER是一个方便的"程序员的类型 - 但是数据库,DBA和数据库性能的噩梦,特别是如果用作主键(因此用作表的聚类索引)。认为至少两次是否要进行切换!!

答案 2 :(得分:0)

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

虽然INT可能不足以支付某些大型项目,但您可以考虑不是来自1而是来自-2,147,483,648来启动IDENTITY。这会使您的身份值加倍。

如果INT不够,您可以考虑使用BIGINT数据类型,我无法想到任何对这么大范围-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807不满意的项目。

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

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

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