我使用SQL Server,当我创建一个新表时,我将一个特定的字段设置为自动增量主键。问题是有些人告诉我,让字段成为主键的自动增量意味着当删除任何记录(他们不关心自动增量字段编号)时,字段会增加,所以在某些时候-例如,如果我的字段的类型是整数-整数的范围将被完全消耗,我将遇到麻烦。所以他们告诉我不要再使用这个功能了。
最好的解决方案是通过代码获取主键的最大值,如果值不存在,最大值将为1,否则为max + 1。
对这个问题有什么建议吗?我可以使用自动增量功能吗?
我也想知道哪些情况下不可取的使用自动递增..and的选择…
注意:这个问题一般不是特定于任何DBMS的,我想知道DBMS是否也是如此,如ORACLE,Mysql,INFORMIX,...
非常感谢。
发布于 2010-11-02 15:21:56
您应该使用标识(自动增量)列。bigint数据类型可以存储值,最高可达2^63-1 (9,223,372,036,854,775,807)。我认为您的系统不会很快达到这个值,即使您要插入和删除大量记录。
如果你正确地实现了你提出的方法,你将会在中遇到很多锁定问题。否则,您将不得不处理由于违反主键约束而抛出的异常(或者更糟糕的是-非唯一值,如果没有主键约束的话)。
发布于 2010-11-02 15:28:49
SQL Server中的int数据类型可以包含从-2,147,483,648到2,147,483,647之间的值。
如果您使用-2,147,483,648作为identity列的种子,例如FooId identity(-2,147,483,648, 1),那么您将有超过40亿个值可用。
如果您真的认为这还不够,您可以使用bigint,它可以保存从-9,223,372,036,854,775,808到9,223,372,036,854,775,807之间的值,但这几乎是多余的。即使有大量的数据量和/或大量的事务,在使用int和使用bigint时,在耗尽标识值之前,您也可能会耗尽磁盘空间或耗尽应用程序的生命周期。
总而言之,您应该使用标识列,并且您不应该关心值之间的差距,因为a)您有足够的候选值,b)这是一个没有逻辑意义的抽象数字。
如果要实现您建议的解决方案,使用派生下一个标识列的代码,则必须考虑并发性,因为您必须在两个相互竞争的事务之间同步对当前最大标识值的访问。实际上,您最终可能会引入显著的性能降级,因为您必须首先读取最大值,计算,然后插入(更不用说同步并发事务所涉及的额外工作)。但是,如果使用标识列,则数据库引擎将为您处理并发。
发布于 2010-11-02 15:22:33
继续在SQL Server中通过PK使用标识功能。在mysql中,也有自动增量功能。不要担心你会用完整数范围,在此之前你会用完硬盘空间。
https://stackoverflow.com/questions/4075624
复制相似问题