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

Как узнать id sql

  • автор:

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

MySQL / MariaDB Как получить id последней вставленной записи в таблице — LAST_INSERT_ID

MySQL / MariaDB Как получить id последней вставленной записи в таблице - LAST_INSERT_ID

В сегодняшней статье мы поговорим о том что такое LAST_INSERT_ID и как его найти в базе данных MySQL и MariaDB.

LAST_INSERT_ID это уникальный идентификатор последней вставленной записи в базе данных с помощью оператора INSERT. Чтобы получить данный идентификатор то в таблице одно поле должно быть в качестве первичного ключа. Поскольку первичный ключ идентифицирует запись в базе данных, он должен быть уникальным. Чтобы запись при вставке всегда была уникальной, то мы можем назначить на это поле свойство AUTO_INCREMENT. Поле первичного ключа обычно называют ID.

Пример таблицы с полем ID которое имеет свойство первичного ключа и свойства AUTO_INCREMENT.

last insert id

Чтобы получить ID последней вставленной записи, нам нужно воспользоваться встроенной функцией LAST_INSERT_ID(). Для начала нужно добавить запись в таблицу.

sql> INSERT INTO fio (first_name, last_name, middle_name) VALUES (‘test_last_insert_id’,’test_last_insert_id’,’test_last_insert_id’);

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

Получаем ID последней записи в таблице.

sql> SELECT LAST_INSERT_ID();

last insert id

В результате мы получили ID последней вставленной записи.

Если мы не добавляли новые данные в таблицу и хотим случайно получить ID последней записи, то в результате мы получим число 0.

last insert id

Всем спасибо, я надеюсь что вам моя статья хоть чем-то помогла.

Как узнать id строки в Базе Данных?

TosterModerator

а как определить id пользователя не получается, вернее не понимаю как получить id в переменную.

Все спасибо проблема решена)

Ваш ответ на вопрос

Войдите, чтобы написать ответ

python

  • Python
  • +2 ещё

Как подставить значение в запрос sqlite?

  • 1 подписчик
  • 5 часов назад
  • 104 просмотра

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

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