【问题标题】:SQL Server: selecting primary key number for a newly added rowSQL Server:为新添加的行选择主键号
【发布时间】:2011-08-20 15:55:30
【问题描述】:

我正在使用

SELECT MAX(CustomerID)...

要选择表的主键CustomerID,新添加行的编号,因为我需要将此编号用于另一个将其用作外键的表。通过INSERT添加一行,依次执行一个SELECT查询。

在 SQL Server Management Studio 的列属性下,我看到 Identity Increment 设置为 1。使用MAX(CustomerID) 来获得我需要的东西有不安全的理由吗?对于此过程,代码将始终是“一行 INSERT 和一个 SELECT 查询”。如果有更好的方法,那会是什么?也许,在某个地方,“给我新添加行的CustomerID”?

【问题讨论】:

    标签: sql-server select identity


    【解决方案1】:

    您建议的 MAX(CustomerID) 方法在并发条件下(并且表为空)会失败

    使用SELECT SCOPE_IDENTITY()OUTPUT 子句。下面两个例子

    CREATE TABLE #Customers
    (
    CustomerID INT IDENTITY(1,1) PRIMARY KEY,
    Name VARCHAR(50)
    )
    
    INSERT INTO #Customers
    (Name) 
    VALUES ('Customer 1')
    
    SELECT SCOPE_IDENTITY()
    
    INSERT INTO #Customers
    (Name) 
    OUTPUT inserted.CustomerID
    VALUES ('Customer 1')
    
    
    DROP TABLE #Customers
    

    【讨论】:

    • 您对此很满意,也非常感谢您提供的示例!我测试了 SECOPE_IDENTITY,效果很好。关于何时失败,根据我描述的程序查询,我会遇到“空表”问题吗?另外,您提到的“并发条件”是指并发数据库连接?
    • @user796837 - 当表中还没有行时,MAX(CustomerID) 将是 NULL。显然,仅适用于您在插入之前进行检查的情况,并且很容易通过ISNULL 解决这个问题。主要问题是并发数据库连接。因为不能保证在您执行insert 和检查MAX 之间的另一个连接不会插入另一行,在这种情况下,您将带回id 以获取错误的行。
    猜你喜欢
    • 2011-09-21
    • 2016-07-23
    • 1970-01-01
    • 2016-12-15
    • 2013-06-13
    • 1970-01-01
    • 2011-09-21
    • 1970-01-01
    • 2012-08-18
    相关资源
    最近更新 更多