在没有自动增量字段的数据库上的sql – AutoIncrement字段

前端之家收集整理的这篇文章主要介绍了在没有自动增量字段的数据库上的sql – AutoIncrement字段前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在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”选项声明列.

所有这些机制都在事务隔离之外运行,确保并发客户端获得唯一的值.在所有情况下,还有一种查询当前会话最近生成的值的方法.必须有,所以你可以使用它在子表中插入行.

原文链接:https://www.f2er.com/mssql/75463.html

猜你在找的MsSQL相关文章