主键的下一个值

时间:2015-04-07 10:08:47

标签: c# database increment

如何在c#中的主键上找到自动增量数据库表的NEXT值或当前的,没有打开新连接?

C#中有方法吗?

2 个答案:

答案 0 :(得分:4)

没有可靠的方法可以做到这一点,因为它会自动成为竞争条件。事实上,不止于此:它可能导致幻影价值。具体来说:如果您执行的插入需要新的IDENTITY值,然后回滚事务,则表的标识不会还原:会有差距。这又是:故意。

在SQL Server中,有IDENT_CURRENT(object)函数返回表的之前的标识值 - 但是应该使用的场景很少(信息工具除外)它。你当然不应该用它来填充辅助插入物。

通常的做法是:

  • 执行插入
  • 让数据库告诉您新的IDENTITY值是什么(SQL Server中的SCOPE_IDENTITY()
  • 使用该值

或者,您可以使用OUTPUT clause

执行一些interesteng多部分插入

答案 1 :(得分:0)

这取决于您的DBMS。

对于SQL Server 2008或更高版本,您可以从sys.indexsys.index_columnssys.identity_columns获取有用的信息:

select object_name(i.object_id) tableName
    , i.name indexName
    , c.name columnName
    , c.is_identity
    , idc.seed_value
    , idc.increment_value
    , idc.last_value
from    sys.indexes i
        inner join 
        sys.index_columns ic on  ic.object_id = i.object_id 
                             and ic.index_id = i.index_id
        inner join 
        sys.columns c on  c.object_id = ic.object_id 
                      and c.column_id = ic.column_id
        left outer join 
        sys.identity_columns idc on  idc.object_id = c.object_id 
                                 and idc.column_id = c.column_id
where i.is_primary_key = 1

正如其他人在评论中提到的那样,last_value可以在您获取它的那一刻与您使用它的那一刻之间发生变化。但是,有一些方法可以避免这个问题,尽管我不建议使用它:

  • 开始交易
  • 获取标识列的下一个预期值
  • 正常使用上面获得的值
  • 检查确实使用的值是预期值
  • 如果一切正常,则提交交易
  • 否则回滚交易并重试。