2015-04-08 2 views
2

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

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

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

+1

Вы можете * обновить 'IDENTITY' (установить новое семя), но это будет ** НЕ ** быть в состоянии магически * найти * недостающие значения ..... он просто будет продолжать раздавать новые значения, начинающиеся с нового семени - это означает, что в какой-то момент произойдет столкновение с уже существующими значениями ** - не очень хорошая идея .... –

+0

Вы подтверждаете мои предположения :) Мне было просто любопытно, если это возможно , но ты дал мне реальный ответ. Благодаря! – veljasije

ответ

1

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

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

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

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

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

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

подробнее об этом (со всеми там варианты находятся) в MSDN Books Online.

2

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

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

--set его

set identity_insert off; 

Identity Insert

+0

Может ли это сделать само собой, без моего действия? Я знаю, что это возможно, как ваш путь, но я предполагаю, что это не разрешено делать автоматически – veljasije

+1

Нет, он сам не корректирует ссылку [link] (http://stackoverflow.com/questions/21824478/reset -identity-seed-after-deleting-records-in-sql-server) для получения дополнительной информации –

Смежные вопросы