我对数据库的东西不太熟悉。但我有一个问题。我正在为我的一个客户端开发一个应用程序,它使用SQL Server 2008 R2,一个表有一个INT IDENTITY
作为主键。
由于数据已在此表中开始泛滥,我必须将INT
更改为Uniqueidentifier
,因为int具有限制,某个范围。我想事先照顾好这个。请建议我改变它的方式。
挑战:
ID
(INT,AUTO INCREMENT,PK)。这只是在数据库中。我几乎没有问题:
请帮我解决这个问题。
提前致谢
阿莫德
答案 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亿年。 ..
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
,并且您知道生成的值在时间和空间上都是唯一的。
作为最佳实践,您应该为列分配尽可能小的数据类型。