Ответ 1
Для MS SQL Server:
SCOPE_IDENTITY()
вернет вам последнее сгенерированное значение идентификации в вашей текущей области:
SELECT SCOPE_IDENTITY() AS NewID
У меня есть небольшая остроумная проблема. Скажем, я вставил строку с некоторыми данными в таблицу, где присутствует первичный ключ. Как бы "ВЫБРАТЬ" первичный ключ только что вставленной строки?
Я должен был быть более конкретным и упомянуть, что я сейчас используя SQLite.
Для MS SQL Server:
SCOPE_IDENTITY()
вернет вам последнее сгенерированное значение идентификации в вашей текущей области:
SELECT SCOPE_IDENTITY() AS NewID
Для SQL Server 2005 и выше, и независимо от типа вашего первичного ключа вы всегда можете использовать предложение OUTPUT
для возврата вставленных значений:
INSERT INTO dbo.YourTable(col1, col2, ...., colN)
OUTPUT Inserted.PrimaryKey
VALUES(val1, val2, ....., valN)
Для MySQL используйте LAST_INSERT_ID()
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
Вы также должны иметь возможность начать транзакцию, вставить строку и выбрать строку, используя поле с уникальным значением, которое вы только что вставили, например, отметку времени или guid. Это должно работать практически во всех СУБД, поддерживающих транзакции, если у вас есть хорошее уникальное поле для выбора строки.
SQL Server:
Вы можете использовать @@IDENTITY
. После оператора вставки вы можете выполнить:
select @@identity
Это даст вам первичный ключ записи, которую вы только что вставили. Если вы планируете использовать его позже, я предлагаю сохранить его:
set @MyIdentity = @@identity
Если вы используете это в хранимой процедуре и хотите получить доступ к ней обратно в своем приложении, убедитесь, что nocount отключен.
Если вам нужно получить новый индекс в MS SQL, когда в таблице есть триггеры, вам нужно использовать небольшое обходное решение. Простой OUTPUT не будет работать. Вы должны сделать что-то вроде этого (в VB.NET):
DECLARE @newKeyTbl TABLE (newKey INT);
INSERT INTO myDbName(myFieldName) OUTPUT INSERTED.myKeyName INTO @newKeyTbl VALUES('myValue'); " & _
SELECT newKey FROM @newKeyTbl;"
Если вы используете .NET, то возвращаемое значение из этого запроса может быть напрямую применено к целому числу (вы должны вызвать "ExecuteScalar" в .NET SqlCommand, чтобы получить возврат).
Для Postgresql:
SELECT CURRVAL(pg_get_serial_sequence('schema.table','id'))
Источник: https://stackoverflow.com/questions/2944297/postgresql-function-for-last-inserted-id
Для SQLite:
SELECT [Column_1], [Column_2],... [Column_n]
FROM [YourTable]
WHERE rowid = (SELECT last_insert_rowid())
тогда как:
Если вы создали YourTable с замененным первичным ключом rowid (т.е. Один столбец pk определен как INTEGER PRIMARY KEY), вы просто используете:
SELECT last_insert_rowid()
Что является частым случаем.
Наконец, это не будет работать для таблиц WITHOUT_ROWID.
Пожалуйста, проверьте:
select MAX(id_column) from table
Это, теоретически, должно вернуть вам последний вставленный идентификатор. Если это занятая база данных с множеством вставок, она может не получить тот, который вы только что сделали, а другой.
Во всяком случае, альтернатива другим методам.