Подтвердить что ты не робот

SQL - Вставка строки и возврат первичного ключа

У меня есть небольшая остроумная проблема. Скажем, я вставил строку с некоторыми данными в таблицу, где присутствует первичный ключ. Как бы "ВЫБРАТЬ" первичный ключ только что вставленной строки?

Я должен был быть более конкретным и упомянуть, что я сейчас используя SQLite.

4b9b3361

Ответ 1

Для MS SQL Server:

SCOPE_IDENTITY() вернет вам последнее сгенерированное значение идентификации в вашей текущей области:

SELECT SCOPE_IDENTITY() AS NewID

Ответ 2

Для SQL Server 2005 и выше, и независимо от типа вашего первичного ключа вы всегда можете использовать предложение OUTPUT для возврата вставленных значений:

INSERT INTO dbo.YourTable(col1, col2, ...., colN)
OUTPUT Inserted.PrimaryKey
VALUES(val1, val2, ....., valN)

Ответ 3

Для MySQL используйте LAST_INSERT_ID()

http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

Вы также должны иметь возможность начать транзакцию, вставить строку и выбрать строку, используя поле с уникальным значением, которое вы только что вставили, например, отметку времени или guid. Это должно работать практически во всех СУБД, поддерживающих транзакции, если у вас есть хорошее уникальное поле для выбора строки.

Ответ 4

SQL Server:

Вы можете использовать @@IDENTITY. После оператора вставки вы можете выполнить:

select @@identity

Это даст вам первичный ключ записи, которую вы только что вставили. Если вы планируете использовать его позже, я предлагаю сохранить его:

set @MyIdentity = @@identity

Если вы используете это в хранимой процедуре и хотите получить доступ к ней обратно в своем приложении, убедитесь, что nocount отключен.

Ответ 5

Если вам нужно получить новый индекс в 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, чтобы получить возврат).

Ответ 7

Для SQLite:

SELECT [Column_1],  [Column_2],...  [Column_n]
FROM [YourTable]
WHERE rowid = (SELECT last_insert_rowid())

тогда как:

  • Column_1, Column_2,... Column_n: являются первичными ключами YourTable.

Если вы создали YourTable с замененным первичным ключом rowid (т.е. Один столбец pk определен как INTEGER PRIMARY KEY), вы просто используете:

SELECT last_insert_rowid()

Что является частым случаем.
Наконец, это не будет работать для таблиц WITHOUT_ROWID.

Пожалуйста, проверьте:

https://www.sqlite.org/lang_corefunc.html#last_insert_rowid

Ответ 8

select MAX(id_column) from table

Это, теоретически, должно вернуть вам последний вставленный идентификатор. Если это занятая база данных с множеством вставок, она может не получить тот, который вы только что сделали, а другой.

Во всяком случае, альтернатива другим методам.