2012-02-12 4 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 

Теперь я ввожу новое значение с вкладышем. Мой вопрос: как я могу получить идентификатор текущей добавленной строки? Есть идеи ??

+3

Какая база данных? SQL Server? MySQL? Oracle? У них есть разные функции для достижения этого. –

+0

Для SQL Server см. [Ссылка] (http://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of- record /) –

+0

MS SQL Server 2008 R2 Express – Jacek

ответ

5

Предполагая, что SQL-сервер, вы должны проверить this article, чтобы получить хорошее понимание получения идентификаторов.

Вот отрывок:

SELECT @@ IDENTITY

возвращает последнее значение IDENTITY производится на связи, независимо от таблицы, полученной значение, и независимо от объем заявления, который дал значение. @@ IDENTITY вернет последнее значение идентификации, введенное в таблицу в вашей текущей сессии. Хотя @@ IDENTITY ограничивается текущим сеансом , он не ограничен текущей областью. Если у вас есть триггер в таблице, которая вызывает создание идентичности в другой таблице, вы получите , который был создан последним, даже если это был созданный им триггер .

ВЫБОР SCOPE_IDENTITY()

Она возвращает последнее значение IDENTITY, полученное на соединение и заявление в том же объеме, независимо от таблицы, которые получают значение. SCOPE_IDENTITY(), например @@ IDENTITY, будет вернет последнее значение идентификации, созданное в текущем сеансе, но оно также будет ограничено и вашей текущей областью, но . Другими словами, он вернет последнее значение идентификатора, которое вы явно создали, , а не любое удостоверение, созданное триггером или пользователем определенная функция.

ВЫБРАТЬ IDENT_CURRENT («имя_таблицы»)

возвращает последнее значение IDENTITY производится в таблице, независимо от соединения, создавшего значение , и независимо от объема заявления, которое произвело значение.IDENT_CURRENT не ограничивается областью и сеансом; это ограничивается указанной таблицей. IDENT_CURRENT возвращает значение идентификатора , сгенерированное для конкретной таблицы в любом сеансе и в любой области.

+0

И не забудьте предложение OUTPUT. Это надёжно! [Ref Microsoft Connect] (https://connect.microsoft.com/SQLServer/feedback/details/328811/scope-identity-sometimes-returns-incorrect-value) – HABO

1

Похоже, SQL Server, и это тот случай, просто использовать:

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()' - ** not ** '@@ IDENTITY' (http://blog.sqlauthority.com/2007/03/25/sql- server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record /) - '@@ IDENTITY' может неожиданно вернуть неправильный результат .... –

1

Использования @@IDENTITY или SCOPE_IDENTITY для MS SQL Server :)

+0

Я бы рекомендовал всегда использовать' SCOPE_IDENTITY() '- у других вариантов часто возникают неожиданные побочные эффекты и результаты .... –

0

Вы также можете сделать это через JDBC напрямую, чтобы избежать необходимости выбирать, так как обычно оператор insert возвращает число вставленных строк, которое вы можете проверить. Весна поддерживает это через его JdbcTemplate, см. here

Смежные вопросы