【问题标题】:Next value of primary key [closed]主键的下一个值[关闭]
【发布时间】:2015-04-07 10:08:46
【问题描述】:

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

C#中有方法吗?

【问题讨论】:

  • 我想获得“当前”值,您将从该表中选择前 1 条记录,按该字段降序排序。为了获得“下一个”值,您需要在该表中插入一条记录并检查该记录中生成的值。您实际上想要完成什么,为什么?
  • 我很确定可靠获取 NEXT 键的唯一方法是插入一行并获取它。我建议不要尝试预测下一个键,因为在您执行插入时它总是有可能发生变化。
  • 没有可靠的方法来确定 SQL Server 中自动增量 (IDENTITY) 列的下一个值。在 INSERT 实际发生之前,无法保证该值。
  • 为什么需要这样做?

标签: c# database increment


【解决方案1】:

没有可靠的方法来做到这一点,因为它会自动成为竞争条件。事实上,不仅如此:它还可能导致虚值。具体来说:如果您执行需要新的IDENTITY 值的插入,然后回滚事务,则表的身份不会恢复:将会出现间隙。这又是:故意的。

在 SQL Server 中,有一个 IDENT_CURRENT(object) 函数可以返回表的previous 标识值 - 但您应该使用它的场景非常少(信息工具除外)。你当然不应该用它来填充二次插入。

这里通常的做法是:

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

或者,您可以使用OUTPUT clause 进行一些有趣的多部分插入

【讨论】:

    【解决方案2】:

    这取决于您的 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
    

    正如其他人在 cmets 中提到的那样,last_value 可以在您获取它的那一刻和您使用它的那一刻之间发生变化。但是,有一些方法可以避免这个问题,虽然我不推荐使用它:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      相关资源
      最近更新 更多