Циркулярные номера IDENTITY в столбце

Можно ли заставить столбец IDENTITY пересчитать свое начальное свойство, когда оно достигнет максимального значения для определенного типа данных, чтобы заполнить пробелы в идентификаторах.

Скажем так, у меня есть столбец типа данных TINYINT, который может содержать значения максимум до 255. Когда столбец заполнен данными до максимально возможного идентификатора, я удаляю одну строку из середины, скажем, ID = 100.

Вопрос в том, могу ли я заставить IDENTITY заполнить этот отсутствующий идентификатор в конце?


person veljasije    schedule 08.04.2015    source источник
comment
Вы можете повторно заполнить IDENTITY (установить новое начальное значение), но он НЕ сможет волшебным образом найти отсутствующие значения..... он просто будет продолжать выдавать новые значения, начиная с нового начального значения, что означает, что в какой-то момент произойдут конфликты с уже существующими значениями - не очень хорошая идея....   -  person marc_s    schedule 08.04.2015
comment
Вы подтверждаете мои предположения :) Мне просто было интересно, возможно ли это, но вы дали мне реальный ответ. Спасибо!   -  person veljasije    schedule 08.04.2015


Ответы (2)


Вы можете повторно заполнить IDENTITY (установить новое начальное значение), но он НЕ сможет волшебным образом найти отсутствующие значения.....

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

Таким образом, в целом повторное заполнение IDENTITY действительно не очень хорошая идея... Просто выберите тип данных, достаточно большой, чтобы справиться с вашими потребностями.

С типом INT, начиная с 1, вы получаете более 2 миллиардов возможных строк — этого должно быть более чем достаточно для подавляющего большинства случаев. С BIGINT получается примерно 922 квадриллиона (922 с 15 нулями — 9 220 000 миллиардов) — вам достаточно??

Если вы используете INT IDENTITY, начиная с 1, и вставляете строку каждую секунду, вам потребуется 66,5 лет, прежде чем вы достигнете лимита в 2 миллиарда....

Если вы используете BIGINT IDENTITY, начинающийся с 1, и вы вставляете тысячу строк каждую секунду, вам потребуется ошеломляющее 292 миллиона лет, прежде чем вы достигнете предела в 922 квадриллиона. ..

Подробнее об этом (со всеми возможными вариантами) читайте в книгах MSDN Online.

person marc_s    schedule 08.04.2015

Да, ты можешь это сделать:

set identity_insert on;
insert into table(id) value(100)

--выключить

set identity_insert off;

Идентификационная вставка

person vhadalgi    schedule 08.04.2015
comment
Может ли это сделать само по себе, без моего участия? Я знаю, что это возможно, как и ваш способ, но я предполагаю, что это не разрешено делать автоматически - person veljasije; 08.04.2015
comment
Нет, он не настраивается сам по себе, посмотрите ссылку для получения дополнительной информации - person vhadalgi; 08.04.2015