Как узнать id строки только что выполненного запроса insert?
Добрый день. Я вставляю данные (которые, возможно, в таблице уже повторяются), и им присваивается ключ id. Как мне в следующем запросе получить id строки, чтоб в дальнейшем работать с id?
Спасибо!
Отслеживать
11 1 1 золотой знак 2 2 серебряных знака 8 8 бронзовых знаков
задан 15 янв 2015 в 5:58
Rakzin Roman Rakzin Roman
5,720 12 12 золотых знаков 80 80 серебряных знаков 179 179 бронзовых знаков
Через что вы делаете sql запросы? Возможно новый id уже имеется и его можно получить без дополнительных запросов. Например я знаю в php в mysqli есть mysql_insert_id в котором храниться id сгенерированный при последнем INSERT-запросе
15 янв 2015 в 6:10
Может я не понял вопроса, но почему не устраивает SELECT id FROM table_name ORDER BY id DESC LIMIT 1 ?
15 янв 2015 в 7:59
@Роман Ракзин, СУБД-то какая? SQL довольно разный бывает от места к месту. @dzukp, это не очень надежный способ. В зависимости от уровня изоляции транзакции он может сработать, а может и наврать.
15 янв 2015 в 8:21
DESC LIMIT 1 — я тоже подумал. Но если предположить, что в друг в эти доли секунд отправляет ещё один человек — тогда это собъётся
DB_ID (Transact-SQL)
Эта функция возвращает идентификационный номер указанной базы данных.
Синтаксис
DB_ID ( [ 'database_name' ] )
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
‘database_name‘
Имя базы данных, идентификационный номер которой вернет функция DB_ID . Если в вызове DB_ID аргумент database_name не указан, функция DB_ID возвращает идентификатор текущей базы данных.
Типы возвращаемых данных
int
Замечания
DB_ID может использоваться только для возврата идентификатора текущей базы данных в Базе данных SQL Azure. Если указанное имя базы данных отличается от текущей базы данных, возвращается значение NULL.
В База данных SQL Azure может не возвращать то же значение, DB_ID что database_id и столбец в sys.database и sys.database_service_objectives. Эти два представления возвращают уникальные значения в логическом сервере, а DB_ID database_id столбец в других системных представлениях возвращает database_id значения, уникальные в пределах одной базы данных или в эластичном пуле.
Разрешения
Если участник, вызывающий DB_ID , не является владельцем конкретной базы данных, отличной от базы данных master или tempdb, то минимальными разрешениями, необходимыми для просмотра соответствующей строки DB_ID , являются разрешения уровня сервера ALTER ANY DATABASE или VIEW ANY DATABASE . Для базы данных master функция DB_ID требует по крайней мере разрешения CREATE DATABASE . База данных, к которой подключается вызывающий участник, всегда отображается в представлении sys.databases.
По умолчанию общедоступная роль имеет разрешение VIEW ANY DATABASE , что позволяет всем именам для входа просматривать информацию в базе данных. Чтобы имя для входа не могло обнаруживать базу данных, отзовите общедоступное разрешение VIEW ANY DATABASE с помощью инструкции REVOKE или отмените разрешение VIEW ANY DATABASE для отдельных имен для входа с помощью инструкции DENY .
Примеры
А. Возвращение идентификатора текущей базы данных
В приведенном ниже примере возвращается идентификатор текущей базы данных.
SELECT DB_ID() AS [Database ID]; GO
B. Возвращение идентификатора указанной базы данных
В приведенном ниже примере возвращается идентификатор базы данных AdventureWorks2022 .
SELECT DB_ID(N'AdventureWorks2008R2') AS [Database ID]; GO
C. Использование DB_ID для указания значения параметра системной функции
В приведенном ниже примере функция DB_ID используется для получения идентификатора базы данных AdventureWorks2022 в системной функции sys.dm_db_index_operational_stats . Эта функция принимает идентификатор базы данных в качестве первого параметра.
DECLARE @db_id INT; DECLARE @object_id INT; SET @db_id = DB_ID(N'AdventureWorks2022'); SET @object_id = OBJECT_ID(N'AdventureWorks2022.Person.Address'); IF @db_id IS NULL BEGIN; PRINT N'Invalid database'; END; ELSE IF @object_id IS NULL BEGIN; PRINT N'Invalid object'; END; ELSE BEGIN; SELECT * FROM sys.dm_db_index_operational_stats(@db_id, @object_id, NULL, NULL); END; GO
Примеры: Azure Synapse Analytics и система платформы аналитики (PDW)
D. Получение идентификатора текущей базы данных
В приведенном ниже примере возвращается идентификатор текущей базы данных.
SELECT DB_ID();
Д. Получение идентификатора именованной базы данных
В этом примере возвращается идентификатор базы данных базы данных базы данных AdventureWorksDW2022.
SELECT DB_ID('AdventureWorksPDW2012');
Как узнать id sql
Есть T-SQL скрипт, который добавляет запись в таблицу (обычный insert). Как после выполнения этого скрипта узнать идентификатор (ID) вновь созданной записи если он (id) генерируется автоматически на стороне сервера? Можно ли это сделать в том же запросе?
Спросил Fish
968 дн., 19 час., 12 мин. назад
Новые ответы
Тут есть несколько вариантов. Кроме функции @@IDENTITY , о которой написал alexey-algel можно также использовать SCOPE_IDENTITY и IDENT_CURRENT .
IDENT_CURRENT — функция возвращает идентификатор последней записи, добавленной в определенную таблицу. Функция привязана именно к таблице и не привязана к области действия или сеансу. Таким образом следующие два запроса вернут одни и те же результаты:
SELECT IDENT_CURRENT("some_table") SELECT MAX(id) FROM some_table
@@IDENTITY — возвращает идентификатор последней записи, добавленной в текущем сеансе, в любую таблицу.
SCOPE_IDENTITY — возвращает идентификатор последней записи, добавленной в текущем сеансе и в текущей области, в любую таблицу.
С функцией IDENT_CURRENT все понятно — она возвращает id только для указанной таблицы. А вот грань между @@IDENTITY и SCOPE_IDENTITY очень тонкая. Чтобы ее почувствовать можно рассмотреть классический пример. Допустим, в базе есть таблица A. На вставку записи в таблицу A установлен триггер, который добавляет запись в другую таблицу B. Тогда, если выполнить скрипт
INSERT (. ) INTO A VALUES (. ) SELECT SCOPE_IDENTITY
То получим идентификатор новой записи таблицы A. Если же выполним
INSERT (. ) INTO A VALUES (. ) SELECT @@IDENTITY
То получим аналогичный идентификатор из таблицы B. Так происходит потому, что триггер срабатывает в том же сеансе, что и вставка записи, но в другой области. Соответственно, функция @@IDENTITY видит все insert’ы сеанса, а SCOPE_IDENTITY — только текущий insert области.
IDENT_CURRENT (Transact-SQL)
Возврат последнего значения идентификатора, созданного для указанной таблицы или представления. Последнее созданное значение идентификатора может относиться к любому сеансу и любой области.
Синтаксис
IDENT_CURRENT( 'table_or_view' )
Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.
Аргументы
table_or_view
Имя таблицы или представления, идентификатор которых возвращается. Аргумент table_or_view имеет тип varchar и не имеет значения по умолчанию.
Типы возвращаемых данных
Исключения
Возвращает значение NULL в случае ошибки или если участник не имеет разрешений для просмотра объекта.
В SQL Server пользователь может просматривать только метаданные защищаемых объектов, принадлежащих пользователю или которым предоставлено разрешение. Это означает, что встроенные функции, создающие метаданные, такие как IDENT_CURRENT, могут вернуть значение NULL в случае, если пользователь не имеет разрешений на объект. Дополнительные сведения см. в разделе Metadata Visibility Configuration.
Замечания
Функция IDENT_CURRENT аналогична функциям идентификаторов SCOPE_IDENTITY и @@IDENTITY в SQL Server 2000 (8.x). Все три функции возвращают созданными последними значения идентификаторов. Однако эти функции различаются областью действия и сеансом, в соответствии с которыми определяется термин last.
- IDENT_CURRENT возвращает последнее значение идентифицирующего столбца, созданное для конкретной таблицы в любом сеансе и области поиска.
- @@IDENTITY возвращает последнее значение удостоверения, созданное для любой таблицы в текущем сеансе во всех область.
- SCOPE_IDENTITY возвращает последнее значение идентификатора, созданное для любой таблицы в текущем сеансе по текущей области поиска.
Если значение IDENT_CURRENT равно NULL (потому что таблица никогда не содержала строк или была усечена), функция IDENT_CURRENT возвращает начальное значение.
Неудачно завершившиеся инструкции и транзакции могут изменить текущий идентификатор таблицы и создать пропуски в значениях столбца идентификаторов. Для значения идентификатора никогда не производится откат, несмотря на то, что транзакция, пытавшаяся вставить в таблицу значение, не была зафиксирована. Например, если инструкция INSERT привела к ошибке из-за нарушения ограничения IGNORE_DUP_KEY, текущее значение идентификатора для таблицы все равно увеличивается.
При использовании функции IDENT_CURRENT в представлении, содержащем объединения, возвращается значение NULL. Это не зависит от того, есть ли столбец идентификаторов только в одной или нескольких объединяемых таблицах.
Будьте внимательны при использовании функции IDENT_CURRENT для прогнозирования следующего создаваемого значения идентификатора. Фактически создаваемое значение может отличаться от полученного с помощью функций IDENT_CURRENT и IDENT_INCR, потому что в других сеансах тоже могут выполняться операции вставки.
Примеры
А. Возврат последнего значения идентификатора, созданного для указанной таблицы
В следующем примере возвращается последнее значение идентификатора, созданное для таблицы Person.Address в базе данных AdventureWorks2022 .
USE AdventureWorks2022; GO SELECT IDENT_CURRENT ('Person.Address') AS Current_Identity; GO
B. Сравнение значений удостоверений, возвращаемых IDENT_CURRENT, @@IDENTITY и SCOPE_IDENTITY
В следующем примере показаны различные идентификаторы, возвращаемые функциями IDENT_CURRENT , @@IDENTITY и SCOPE_IDENTITY .
USE AdventureWorks2022; GO IF OBJECT_ID(N't6', N'U') IS NOT NULL DROP TABLE t6; GO IF OBJECT_ID(N't7', N'U') IS NOT NULL DROP TABLE t7; GO CREATE TABLE t6(id INT IDENTITY); CREATE TABLE t7(id INT IDENTITY(100,1)); GO CREATE TRIGGER t6ins ON t6 FOR INSERT AS BEGIN INSERT t7 DEFAULT VALUES END; GO --End of trigger definition SELECT id FROM t6; --IDs empty. SELECT id FROM t7; --ID is empty. --Do the following in Session 1 INSERT t6 DEFAULT VALUES; SELECT @@IDENTITY; /*Returns the value 100. This was inserted by the trigger.*/ SELECT SCOPE_IDENTITY(); /* Returns the value 1. This was inserted by the INSERT statement two statements before this query.*/ SELECT IDENT_CURRENT('t7'); /* Returns value inserted into t7, that is in the trigger.*/ SELECT IDENT_CURRENT('t6'); /* Returns value inserted into t6. This was the INSERT statement four statements before this query.*/ -- Do the following in Session 2. SELECT @@IDENTITY; /* Returns NULL because there has been no INSERT action up to this point in this session.*/ SELECT SCOPE_IDENTITY(); /* Returns NULL because there has been no INSERT action up to this point in this scope in this session.*/ SELECT IDENT_CURRENT('t7'); /* Returns the last value inserted into t7.*/