在MS sql Server中很容易创建自动增量字段.在我的系统中,我停止为主键使用自动增量字段,现在我使用Guid.这真的很棒,我有这么多的优势.但是在另一个非主要关键领域,我真的需要实现一个“软的自动增量”.这是因为我的系统是独立于数据库的,所以我在c#中以编程方式创建了autoinc值.
我想在自动增量的数据库上自动增量领域的解决方案,您使用的解决方案是什么?有一些sql Ansi语句呢?并直接从我的c#生成,是一个更好的解决方案?
PS:我知道从表中选择max(id)1不是真的并发友好…
解决方法
生成唯一ID值的机制不能与事务隔离有关.这是数据库为每个客户端生成不同值所需要的,比SELECT MAX(id)1 FROM table的技巧更好,如果两个客户端尝试并发分配新的id值,则会导致竞争条件.
您无法使用标准SQL查询模拟此操作(除非您使用表锁或可序列化的事务).它必须是内置到数据库引擎中的机制.
在sql:2003之前,ANSI sql没有描述为代理键生成唯一值的操作.在此之前,没有自动增加列的标准,所以几乎所有品牌的RDBMS都提供了一些专有的解决方案.当然,它们的变化很大,没有办法以简单,数据库独立的方式使用它们.
> MySQL具有AUTO_INCREMENT列选项,或等同于BIGINT UNSIGNED AUTO_INCREMENT的SERIAL伪数据类型;
> Microsoft sql Server具有IDENTITY列选项和NEWSEQUENTIALID(),这是auto-increment和GUID之间的东西;
> Oracle有一个SEQUENCE对象;
> Postgresql具有SEQUENCE对象或SERIAL伪数据类型,根据命名约定隐式创建序列对象;
> InterBase / Firebird有一个GENERATOR对象,它几乎像Oracle中的一个SEQUENCE; Firebird 2.1也支持SEQUENCE;
> sqlite将声明为主键的任何整数视为隐式自动递增;
> DB2 UDB具有几乎所有内容:SEQUENCE对象,或者可以使用“GEN_ID”选项声明列.
所有这些机制都在事务隔离之外运行,确保并发客户端获得唯一的值.在所有情况下,还有一种查询当前会话最近生成的值的方法.必须有,所以你可以使用它在子表中插入行.