自增量思考
时间:2011-04-30 来源:小白乙
系统中的主键自增量控制困扰了我很久,一直没有一种完美的解决方法。
生成自增量对于不同数据库有不同的用法,在SQLServer中可定义自增量列(identity(1,1))来实现每次插入数据就让字段自增; 在ORACLE中则可以先定义一个sequence, 然后在数据表中建立一个触发器,每次插入则获取最新sequence添加到新增记录的自增字段中。
这样自增量的增长是由数据库来控制,可是在大多情况下插入数据后程序中需要马上知道插入的这条数据的自增量值是多少? 针对SQLServer,很多人喜欢SELECT MAX(ID)+1取得自增量值,然后插入数据,可是在数据库插入事务非常频繁而且客户端非常繁多的时候总有出错的几率,虽然这个几率很渺小,这样做并不完美; 针对ORACLE,可以把序列的增长不让数据库自己完成,在程序中先获取 sequence最大值然后插入到数据库中,但是这种做法我不是很喜欢,因为这种做法只在ORACLE中可行,并不通用,而且影响规范开发程序。
除此之外还有一种在C#中生成GUID来做主键的方式,这种方式在完全由C#构成的系统中还是很好用,但是如果系统中使用了储存过程控制一部分业务就很麻烦,现在的几种主流数据库中无法生成GUID,有些达人做出了比较山寨的GUID生成方式,但毕竟是山寨。 而且大多系统开发中都是统一使用了自增量的方式,GUID很难融入其中。
相关阅读 更多 +