2011-08-19 50 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'帶回來。 –