Следующее значение первичного ключа

1

Как я могу найти значение NEXT таблицы автоматической инкреции databse или текущего, без открытия нового соединения, на первичном ключе в С#?

Есть ли способ в С#?

  • 0
    Я полагаю, чтобы получить «текущее» значение, которое вы выбрали бы из первой таблицы из этой таблицы, упорядочиваясь по убыванию этого поля. И чтобы получить «следующее» значение, вы должны вставить запись в эту таблицу и проверить сгенерированное значение в этой записи. Чего вы на самом деле пытаетесь достичь и почему?
  • 7
    Я уверен, что единственный способ надежно получить NEXT-ключ - это вставить строку и получить ее. Я бы не советовал пытаться предсказать следующий ключ, так как всегда будет вероятность того, что он изменился к тому времени, когда вы выполняете вставку.
Показать ещё 2 комментария
Теги:
database
increment

2 ответа

4

Нет надежного способа сделать это, потому что это автоматически будет состоянием гонки. На самом деле, более того: это может привести к фантомным значениям. В частности: если вы вставляете требуемое новое значение IDENTITY, а затем откатываете транзакцию, то идентификатор таблицы не возвращается: будет пробел. Это снова: преднамеренно.

В SQL Server есть IDENT_CURRENT(object) которая возвращает предыдущее значение идентификатора для таблицы, но существует очень мало сценариев (кроме информационных инструментов), где вы должны их использовать. Вы, конечно же, не должны использовать его для первичных вставок.

Обычный подход здесь:

  • сделать вставку
  • пусть база данных сообщит вам, что такое новое значение IDENTITY (SCOPE_IDENTITY() в SQL Server)
  • использовать это значение

В качестве альтернативы вы можете сделать несколько вкладок для нескольких частей, используя предложение OUTPUT

0

Это зависит от вашей СУБД.

Для SQL Server 2008 или новее вы можете получить полезную информацию из sys.index, sys.index_columns и sys.identity_columns:

select object_name(i.object_id) tableName
    , i.name indexName
    , c.name columnName
    , c.is_identity
    , idc.seed_value
    , idc.increment_value
    , idc.last_value
from    sys.indexes i
        inner join 
        sys.index_columns ic on  ic.object_id = i.object_id 
                             and ic.index_id = i.index_id
        inner join 
        sys.columns c on  c.object_id = ic.object_id 
                      and c.column_id = ic.column_id
        left outer join 
        sys.identity_columns idc on  idc.object_id = c.object_id 
                                 and idc.column_id = c.column_id
where i.is_primary_key = 1

Как упоминалось в комментариях, last_value может измениться между моментом, когда вы его last_value и в тот момент, когда вы его используете. Однако есть способы избежать этой проблемы, хотя я не рекомендую ее использовать:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню