Дополнительно
Лучший способ получить идентификатор вставленной строки?
Каков наилучший способ получить IDENTITY
вставленного ряда?
Я знаю о @@IDENTITY
, IDENT_CURRENT
и SCOPE_IDENTITY
, но не понимаю плюсов и минусов каждого из них.
Кто-нибудь может объяснить, в чем разница и когда я должен использовать каждый из них?
1051
13
@@IDENTITY
возвращает последнее значение идентификатора, созданное для любой таблицы в текущей сессии, во всех диапазонах. Вы должны быть осторожны здесь, так как это происходит во всех диапазонах. Вы можете получить значение из триггера, а не из текущего оператора.SCOPE_IDENTITY()
возвращает последнее значение идентификатора, созданное для любой таблицы в текущей сессии и текущей области видимости. Обычно то, что вы хотите использовать.IDENT_CURRENT('tableName')
возвращает последнее значение идентификатора, созданное для определенной таблицы в любой сессии и любой области видимости. Это позволяет вам указать, из какой таблицы вы хотите получить значение, в случае, если два вышеуказанных варианта не совсем то, что вам нужно (очень редко). Также, как отметил @Guy Starbuck, "Вы можете использовать это, если хотите получить текущее значение IDENTITY для таблицы, в которую вы не вставляли записи"Пункт
OUTPUT
оператораINSERT
позволит вам получить доступ к каждой строке, которая была вставлена с помощью этого оператора. Поскольку она привязана к конкретному оператору, она более проста, чем другие функции, описанные выше. Однако она немного более многословна (вам потребуется вставить в табличную переменную/временную таблицу и затем запросить ее) и дает результаты даже в сценарии ошибки, когда оператор откатывается назад. Тем не менее, если ваш запрос использует параллельный план выполнения, это единственный гарантированный метод для получения идентичности (если не отключать параллелизм). Однако он выполняется до триггеров и не может быть использован для возврата значений, генерируемых триггерами.Я считаю самой безопасной и наиболее точный способ получения вставленный идентификатор будет использовать предложение output.
например (взято из следующих в MSDN статьи)
Я'м говорить то же самое, как и другие ребята, так что все's правильное, Я'м просто пытаюсь сделать его более ясным.
Возвращает функция@@Identity
идентификатор последней вещью, которая была вставлена на ваш клиент's для подключения к базе данных. Большую часть времени это работает нормально, но иногда триггер пойдет и вставить новую строку, что вы Дон'т знаю о, и вы'll получить код с новой строки, а не тот, который вы хотите`Функция scope_identity () решает эту проблему. Она возвращает идентификатор последнего, что вставить в SQL-код вы отсылается в базу данных. Если триггеры пойти и создать дополнительные строки, они выиграли'т привести к неправильному значению к вам вернулся. Ура
Функция ident_current
возвращает последний ID, который был вставлен кем-либо. Если какое-то другое приложение происходит для того, чтобы вставить еще одну строку в unforunate время, вы'll получить идентификатор этой строки вместо одной.Если вы хотите играть безопасно, всегда использовать
функция scope_identity()
. Если вы палку сфункция@@Identity
и кто-то решит добавить триггер позже, все ваш код будет перерыв.Самый лучший (читай: самый безопасный) способ получить идентификатор только что вставленной строки с помощью
выход
статья:Добавить
в конце SQL-оператор Insert, затем
будет получать он.
Когда вы используете рамки сущности, он внутренне использует
выход
метод, чтобы вернуться вновь вставленный идентификаторВыходные результаты сохраняются во временной таблице переменных, вернулся к столу, и вернуть значение строки из таблицы.
Примечание: Я понятия не имею, почему эф бы внутреннее соединение эфемерное в реальной таблице (при каких обстоятельствах бы не матч).
Но, что's что ФВ делает.
Этот метод (
выход
) доступна только в SQL Server 2008 или более новые.MSDN
@@IDENTITY - это последний идентификатор, вставленный с помощью текущего SQL-подключения. Это хорошее значение для возврата из хранимой процедуры insert, когда вам просто нужно вставить идентификатор для новой записи, и неважно, были ли добавлены другие строки после этого.
SCOPE_IDENTITY - это последний идентификатор, вставленный с использованием текущего SQL-подключения и в текущей области видимости - то есть, если после вашей вставки будет вставлен второй идентификатор на основе триггера, он не будет отражен в SCOPE_IDENTITY, только вставка, которую вы выполнили. Честно говоря, у меня никогда не было причин использовать это.
IDENT_CURRENT(tablename) - это последний вставленный идентификатор, независимо от соединения или области видимости. Это можно использовать, если вы хотите получить текущее значение IDENTITY для таблицы, в которую вы не вставляли записи.
Я могу'т поговорить с другими версиями SQL Server, но в 2012 году, выводящий напрямую работает просто отлично. Вы Don'т придется беспокоиться о временной таблицы.
Кстати, эта техника также работает при вставке нескольких строк.
Выход
**** Всегда использовать функции scope_identity(), там's никогда не нужно ничего другого.
Создать
идентификатор
и вставить его в столбец. Затем вы можете легко определить вашу строку с UUID. Вот только 100% рабочим раствором можно реализовать. Все остальные решения слишком сложны и не работают в той же крайние случаи.После инструкции Insert, вам необходимо добавить это. И убедитесь, что имя таблицы, где данные вводить.Вы получите в текущей строке нет, где строки влияет только сейчас по вашей инструкции Insert.
Если вы искали последний код добавлена/обновлена, это может быть немного старомодно, но есть много людей, использующих старые версии PHP, до 5.5 если быть более точным. Более подробную информацию можно найти на http://php.net/manual/en/function.mysql-insert-id.php