2012-02-12 73 views
3

我已經創建的表在我的分貝在此聲明實際插入的行ID

CREATE TABLE tPerson 
    (
     id INT NOT NULL PRIMARY KEY identity(1,1) 
     , name NVARCHAR(100) not null 
     , email NVARCHAR(30) not null 
    ) 
GO 

現在我插入帶有插入新的價值。我的問題是如何獲得當前添加的行的ID?任何想法 ??

+3

哪個數據庫? SQL Server? MySQL的?甲骨文?它們具有完成此功能的不同功能。 – 2012-02-12 18:18:03

+0

對於SQL Server,請參閱[鏈接](http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-記錄/) – 2012-02-12 18:24:34

+0

MS SQL Server 2008 R2 Express – Jacek 2012-02-12 18:38:26

回答

5

假設SQL服務器,您應該檢出this article以更好地理解檢索身份。

這裏有一個片段:

SELECT @@ IDENTITY

它返回一個 連接最後產生的IDENTITY值,不管產生的數據表,並 不管產生價值的陳述的範圍。 @@ IDENTITY將返回您當前會話中輸入到 表中的最後一個標識值。雖然@@ IDENTITY僅限於當前的 會話,但它不限於當前範圍。如果在導致在另一個表中創建標識的表上有觸發器 ,則您的 將獲得最後創建的標識,即使它是創建該標識的 觸發器。

SELECT SCOPE_IDENTITY()

它返回上 的連接,並通過在同一範圍的陳述所產生的最後一個標識值,而不管 表的所產生的值。 SCOPE_IDENTITY(),如@@ IDENTITY, 將返回當前會話中創建的最後一個標識值,但其 也會將其限制爲您當前的範圍。換句話說,它將返回您明確創建的最後一個標識值,即 ,而不是由觸發器或用戶定義的函數創建的任何標識。

SELECT IDENT_CURRENT(「表名」)

它返回一個表中產生的最後一個標識值 ,而不考慮創建該 值的連接的,也不管所產生的聲明的範圍的值爲 。IDENT_CURRENT不受範圍和會話的限制;它是 限於一個指定的表。 IDENT_CURRENT返回爲任何會話和任何範圍中的特定表生成的標識值 。

+0

並且不要忘記OUTPUT子句。這是可靠的! [參考Microsoft連接](https://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value) – HABO 2012-02-13 01:56:53

1

它看起來像SQL服務器,並且這種情況下,只需使用:

INSERT INTO dbo.tPerson(....) VALUES(.....) 

DECLARE @NewID INT 
SELECT @NewID = SCOPE_IDENTITY() 

SCOPE_IDENTITY返回在當前的範圍內最後插入IDENTITY值。

注意:「電子郵件」只有30個字符!!?我通常做,在我的表中的最長柱 - 200個字符甚至更多:-)

0

嘗試

SELECT @@IDENTITY AS LastID 

你INSERT後

+2

[您應該使用'SCOPE_IDENTITY()' - **而不是**'@@ IDENTITY'](http://blog.sqlauthority.com/2007/03/25/sql- server @ identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record /) - '@@ IDENTITY'可以意外地返回錯誤的結果.... – 2012-02-12 18:25:00

1

使用@@IDENTITYSCOPE_IDENTITY MS SQL Server的:)

+0

我建議總是使用'SCOPE_IDENTITY ()' - 其他選項往往具有意想不到的副作用和結果.... – 2012-02-12 18:27:07

0

您也可以通過JDBC直接執行此操作以避免選擇,因爲通常情況下,插入語句將返回您可能要驗證的插入行數。 Spring通過它的JdbcTemplate支持這個,參見here