IDENTITY SEED увеличивается на основе начальных значений других таблиц

Я использую SQL SERVER 2017 и SSMS. Я создал несколько таблиц, первичный ключ которых равен int и включил Identity, и установил Identity Increment = 1 и Identity Seed = 1. Для всех таблиц я использовал один и тот же метод. Но когда я добавил одну запись в таблицу, скажем, Lead, ее идентификатор был 2, затем добавил значение в таблицу, скажем, Followup, тогда ее идентификатор был 3. Здесь я добавляю скриншоты для лучшего понимания

Ведущий стол

Последующая таблица

Есть ли какой-либо вариант, чтобы избежать этого? можем ли мы сохранить личность для каждой таблицы?

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

Damien_The_Unbeliever 14.12.2020 09:21

@Damien_The_Unbeliever Спасибо за ваш ответ. Работает ли Identity так?

Dhanil Dinesan 14.12.2020 09:50
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
299
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Документация достаточно конкретна в отношении того, что identity не гарантирует:

Свойство identity в столбце не гарантирует следующее:

  • Уникальность значения. . .

  • Последовательные значения внутри транзакции. . .

  • Последовательные значения после перезагрузки сервера или других сбоев. . .

  • Повторное использование значений

В общем, свойство «уникальность» не является проблемой, потому что столбцы идентификаторов обычно являются первичным ключом (или обычно объявляются как минимум unique), что гарантирует уникальность.

Цель столбца identity — предоставить уникальный числовой идентификатор, отличный от других строк, поэтому его можно легко использовать в качестве первичного ключа. Других гарантий нет. А для повышения производительности SQL Server имеет множество сокращений, которые приводят к пробелам.

Если вы не хотите пробелов, то самый простой способ — присвоить значение при запросе:

row_number() over (order by <identity column>)

Это не на 100% удовлетворительно, потому что удаление может повлиять на значение. Я также думаю, что в параллельных системах вставки тоже могут (поскольку идентификаторы могут кэшироваться на отдельных узлах).

Если вас не волнует производительность, вы можете использовать sequence для присвоения значения. Это менее эффективно, чем использование identity. По сути, требуется сериализация всех вставок, чтобы гарантировать свойства вставки.

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

Другие вопросы по теме