SQL - вставка строки и возврат первичного ключа - PullRequest
26 голосов
/ 12 декабря 2011

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

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

Ответы [ 8 ]

50 голосов
/ 12 декабря 2011

Для MS SQL Server:

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

SELECT SCOPE_IDENTITY() AS NewID
33 голосов
/ 12 декабря 2011

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

INSERT INTO dbo.YourTable(col1, col2, ...., colN)
OUTPUT Inserted.PrimaryKey
VALUES(val1, val2, ....., valN)
6 голосов
/ 12 декабря 2011

SQL Server:

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

select @@identity

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

set @MyIdentity = @@identity

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

6 голосов
/ 12 декабря 2011

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

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

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

2 голосов
/ 10 июля 2015

Если вам нужно получить новый индекс в MS SQL, когда в таблице есть триггеры, вам придется использовать небольшой обходной путь. Простой ВЫХОД не будет работать. Вы должны сделать что-то вроде этого (в 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).

0 голосов
/ 22 января 2019

Для 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

0 голосов
/ 04 августа 2016
select MAX(id_column) from table

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

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

0 голосов
/ 12 декабря 2011

Для Postgresql:

SELECT CURRVAL(pg_get_serial_sequence('schema.table','id'))

Источник: /1805346/funktsiya-postgresql-dlya-poslednego-vstavlennogo-identifikatora

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...