Как узнать следующее значение первичного ключа таблицы без вставки записи в SQL Server? - PullRequest
5 голосов
/ 23 декабря 2011

В моем проекте есть вещи, где мне нужно отобразить следующий первичный ключ в поле, не вставляя запись физически?

Как узнать следующее значение первичного ключа без вставки записи?

т.е. Давайте иметь 10 записей с идентификаторами столбцов в качестве первичного ключа. Теперь я удалил 10-ую запись, поэтому следующее значение будет 11.

Я хочу узнать значение следующего первичного ключа (в моем случае - 11), не вставляя запись физически в таблицу.

Короче, будущая следующая величина первичного ключа.

Как я могу получить это?

Пожалуйста, предоставьте решение.

Ответы [ 5 ]

8 голосов
/ 23 декабря 2011

РЕДАКТИРОВАТЬ (очень важно)

Следует отметить, что этот метод может использоваться для прогнозирования следующего идентификатора, но не гарантирует это значение. Причина этого заключается в том, что @marc_s упоминается в комментариях, что между временем, когда вы запросили значение, и временем, когда вы его используете, в эту таблицу могла бы быть вставлена ​​другая транзакция, что сделало бы предположение о том, что полученное значение пусто и недействительно.

Как уже упоминалось, если ваша реализация основана на таком допущении, вы допустили некоторые ошибки проектирования и должны рассматривать переработку этого решения в качестве первого приоритета.

С IDENT_CURRENT (Transact-SQL)

Возвращает последнее значение идентификатора, созданное для указанной таблицы или Посмотреть. Последнее сгенерированное значение идентификатора может быть для любого сеанса и любого Объем.

Посмотрите на следующий пример

CREATE TABLE #Table (
        ID INT IDENTITY(1,1),
        Val INT
)

INSERT INTO #Table SELECT 1
INSERT INTO #Table SELECT 2
INSERT INTO #Table SELECT 3

SELECT * FROM #Table

DELETE FROM #Table WHERE ID >= 2

SELECT * FROM #Table

SELECT IDENT_CURRENT('#Table')

DROP TABLE #Table
4 голосов
/ 23 декабря 2011

То, что вы спрашиваете, не имеет смысла.Базы данных предназначены для поддержки множественного доступа, поэтому даже если бы существовал способ определения следующего идентификатора первичного ключа без вставки записи, была бы нулевая гарантия того, что другое соединение не запишет эту таблицу и не потребует этот идентификатор до завершения следующей транзакции.И если вы думаете: «Ну, я мог бы держать это под контролем», то вы в основном устранили любую правдоподобную ситуацию, в которой знание будущего идентификационного ключа могло бы помочь вам.будущий идентификационный ключ?

1 голос
/ 23 декабря 2011

В текущей версии SQL Server (2008 R2) и с использованием механизма IDENTITY вы НЕ МОЖЕТЕ заранее узнать следующее значение.Существует нет правильного, гарантированного способа узнать следующее значение, пока вы фактически не вставите строку - только тогда, когда строка сохраняется внутри таблицы, это значение определяется и возвращается.

SQL Server 2012 («Denali») будет иметь SEQUENCES, что почти совпадает с IDENTITY столбцами - но автономно и с последовательностями вы можете запросить следующее значение (а затем использовать его)

Подробнее о последовательностях:

0 голосов
/ 08 мая 2016

Не очень хорошая идея, но если вам нужен гарантированный первичный ключ, я бы предложил временно вставить фиктивную запись и получить ее первичный ключ, а затем либо изменить запись, используя UPDATE, когда запись зафиксирована, либо УДАЛИТЬ запись, если пользователь отменяет вставку. В любом случае, это лучше, чем использовать воображаемый ключ.

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

выберите IDENT_CURRENT («пользователи»)

выберите IDENT_CURRENT («имя таблицы»)

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