我应该在实体框架模型中使用int还是long作为主键?

28

我正在编写一个MVC5互联网应用程序,关于模型的id字段有一个问题。

在模型中的id字段,应该使用int还是long? 我说的是用于主键的字段。如果数据库有成千上万条记录,int是否足够? 在c#中的int与SQL数据库中的int是否不同?

先提前感谢。


1
иҜ·жіЁж„ҸпјҢеҰӮжһңжӮЁзҡ„Code Firstзұ»зҡ„дё»й”®еұһжҖ§жҳҜlongзұ»еһӢпјҢеҲҷеҸҜиғҪйңҖиҰҒеҗ‘иҜҘеұһжҖ§ж·»еҠ [Key] DataAnnotationгҖӮ - Aaron Hoffman
3个回答

69
使用类型为INT,从1开始,您可以获得超过20亿个可能的行 - 这应该足够满足绝大多数情况。使用BIGINT,你大约可以获得922万亿(15个零的922个 - 922'000亿)-够了吗?如果您使用从1开始的INT IDENTITY并且您每秒插入一行,全天候,您需要66.5 才能达到20亿限制....如果您使用从1开始的BIGINT IDENTITY(在T-SQL中,BIGINT定义为.NET语言中的longInt64),并且您每秒插入1000行,则需要惊人的292亿年才能达到922万亿限制.... 在MSDN Books Online中阅读更多详细信息(包括所有选项)。

3
每当SQL服务意外关闭/失败时,将计数器加1000,因为服务器在缓存中提前保存了1000个数字,并在失败时不会将它们放回,所以您可以轻松地看到标识列中的1000跳。我会在定义的每个标识列中轻松选择“长”(Int64)版本。如果您不了解此行为,请参阅:https://dev59.com/-mYq5IYBdhLWcg3w0j4T#14162761 - Jacob

11

两种方法都可以,这取决于表中将有多少记录。int每个表只允许2*10^9条记录。

如果您确定2*10^9足够,请使用int作为键。

但是: 如果有微小的机会记录数将超过2*10^9,请使用long。 如果您不知道将有多少记录,请使用long。


大小不是2*10^9,而是2^31。 - Erik Funkenbusch
8
@Erik Funkenbusch: 2的10次方等于1024,大约相当于10的3次方。2的31次方等于2乘以2的9次方。因此,它大约相当于2乘以(10的3次方)的三次方,即2乘以10的9次方。 - Dmitriy Finozhenok

6

C#和SQL对于int的定义是相同的,它是一种整数数据类型,范围从-2^312^31 - 1(如果你喜欢,就是2,147,483,647)。

可以看出,您的10万条记录可以在一个int中容纳超过20,000次,所以在当前情况下,您将没问题。

然而,long将转换为SQL中的bigint(并没有“long”这个类型),其值上限为2^63 - 1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接