【问题标题】:How does SQL Server generate values in an identity column?SQL Server 如何在标识列中生成值?
【发布时间】:2012-09-16 15:26:44
【问题描述】:

我的问题是,如果我在一张表中并行进行两次批量插入,SQL Server 如何创建标识值?

我的意思是,如果我在一个会话中插入多行(Row1-Row2-Row3),同时另一个会话同时插入多行(Row4-Row5-Row6),结果会是这样吗?

Row1
Row2
Row3
Row4
Row5
Row6

或者可能是这样的?

Row1
Row6
Row3
Row5
Row4
Row2

【问题讨论】:

    标签: sql-server sql-server-2008 tsql identity-column


    【解决方案1】:

    您犯了假设表格中的顺序的常见谬误。表没有顺序。只有结果有顺序,除非指定了明确的 ORDER BY,否则它是不确定的。

    您可能会问一个不同的问题:在并发插入的情况下,标识生成的值是如何分配的?答案很简单:没关系。如果您对订单做出任何假设,那么您的代码就会被破坏。间隙也是如此。即使生成的身份是完全随机的,您的应用程序也应该可以工作,并且如果身份是完全随机的,正确编写的应用程序工作。使用SCOPE_IDENTITY() 检索最后插入的身份。更好的是,使用INSERTOUTPUT 子句,它也适用于多行插入。

    为了记录:身份是按照操作获得对log stream的访问权的顺序生成的。

    【讨论】:

    • 感谢重播。我使用了 SCOPE_IDENTITY() 但我想知道我能否确定批量插入我的预览身份是否为 SCOPE_IDENTITY()-1?
    • 是一个错误的假设。正如我所说,对多行插入使用 OUTPUT 子句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 2013-10-09
    • 2010-10-14
    相关资源
    最近更新 更多