Как узнать id sql
Перейти к содержимому

Как узнать id sql

  • автор:

Как узнать 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.*/ 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *