2011-08-19 36 views
1

我目前使用SQL Server:对于一个新加入的行选择主键数

SELECT MAX(CustomerID)... 

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

在SQL Server Management Studio的列属性下,我看到Identity Increment设置为1。有没有不安全的理由使用MAX(CustomerID)来获得我所需要的?该过程的代码将始终是“单行INSERT和一个SELECT查询”。如果有更好的方法,那会是什么?也许,沿着这条线的某个地方,“让我加入新增行的CustomerID”?

回答

2

您与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 
+1

您对此非常感兴趣,并且非常感谢您的示例!我测试了SECOPE_IDENTITY,它效果很好。关于何时失败,在我描述的程序性问题下,我是否会遇到“空表”问题?另外,你提到的“并发条件”是指并发数据库连接? – musicliftsme

+2

@ user796837 - 表中没有行时,'MAX(CustomerID)'将为'NULL'。显然只适用于在插入之前进行检查的情况,并且很容易用'ISNULL'解决。主要问题是并发数据库连接。由于不能保证另一行不会被另一个连接插入,因此在执行'insert'和检查'MAX'时,在这种情况下,您会将错误行的'id'带回来。 –