Как новая функция Identity Jump в Microsoft SQL Server 2012 обрабатывает диапазон типов данных?

Я думал, что это ошибка, но после прочтения этой статьи http://www.codeproject.com/Tips/668042/SQL-Server-2012-Auto-Identity-Column-Value-Jump-Is, я обнаружил, что это новая функция SQL Server. 2012.

Эта функция автоматически увеличивает значение вашего последнего столбца идентификаторов на 1000 (целые числа) для новых строк (10000 для больших чисел).

введите описание изображения здесь

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

Но мне интересно, что, если значения этих столбцов идентификаторов превышают диапазон типа данных (int или bigint)? Как он обрабатывает диапазон и размер столбца?


person Aishwarya Shiva    schedule 23.04.2016    source источник
comment
Решение в статье очень простое и занимает 5 минут. Я применил решение -t272, и оно отлично работает.   -  person Alex Kudryashev    schedule 26.04.2016


Ответы (3)


Существующие столбцы Identity завершатся с ошибкой «Сервер: сообщение 8115, уровень 16, состояние 1, строка 2. Ошибка арифметического переполнения при преобразовании IDENTITY в тип данных int. Произошло арифметическое переполнение». См. http://www.sql-server-performance.com/2006/identity-integer-scope/ для обсуждения.

Нет причин подозревать, что Identity Jump будет вести себя по-другому. Я бы не хотел, чтобы он охотился за неиспользованными идентичностями в более ранней последовательности.

person PhillipH    schedule 26.04.2016
comment
Спасибо за эту ссылку и stackoverflow.com/questions/13132939/ устраняет путаницу. Хотя это вопрос mysql, но он имеет смысл. Если я добавляю значения постепенно, начиная с нуля то потребуется 300 миллионов лет и 67 108 863 терабайт свободного места. Потому что максимальный bigint равен 9223372036854775807. При 1000 вставок в секунду это составляет 106751991167 дней. Почти 300 миллионов лет, как объяснил @CraigRinger. Единственная проблема заключается в том, что когда вы вводите максимальный предел. - person Aishwarya Shiva; 30.04.2016

Почему бы вам не использовать Sequence в MS Server 2012.

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

CREATE SEQUENCE SerialNumber AS BIGINT
START WITH 1
INCREMENT BY 1
MINVALUE 1
MAXVALUE 9999999
CYCLE;
GO

Если вам нужно добавить начальный «0» к последовательности, просто сделайте это с помощью следующего кода:

RIGHT ('0000' + CAST (NEXT VALUE FOR SerialNumber AS VARCHAR(5)), 4) AS SerialNumber 
person Peter    schedule 27.04.2016

Проблема была исправлена ​​в последней версии обновлений SQL Server. Это была ошибка.

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

Этот сценарий может помочь вам узнать начальные значения, значения приращения и текущее значение столбца идентификаторов http://blog.sqlauthority.com/2014/08/29/sql-server-query-to-find-seed-значения-инкремент-значения-и-текущая-идентификация-значение-столбца-таблицы-с-максимальным-значением-типа-данных-часть-2/

Мое предложение: примените последние исправления, CU или пакет обновления.

person pinaldave    schedule 27.04.2016
comment
Можете ли вы дать ссылку на любую документацию по этому исправлению? Я не вижу последних обновлений элемента подключения здесь connect.microsoft.com/SQLServer/feedback/details/739013/, хотя в нем говорится, что проблема с отключением диспетчера управления будет решена в какой-то момент. - person Martin Smith; 27.04.2016
comment
Какая именно проблема была исправлена, я не понимаю. - person ypercubeᵀᴹ; 27.04.2016