2013-12-04 5 views
0

Во время работы с базой данных SQL Server я обнаружил, что значение столбца столбца неожиданно переходит на 101 в SQL Server 2012 Enterprise edition.SQL Server: столбец идентификатора принимает произвольный диапазон

Всего в базе данных было 10 записей с идентификаторами (от 1 до 10). Существовали не операция удаления не была выполнена, и при вставке записи номер 11 это инструмент 101.

И я узнал причину после просмотра некоторых онлайн помогает:

Here, Here и Here.

Есть ли другая причина, по которой это происходит?

+3

Поиск «Ошибка идентификации SQL Server 2012» должен найти множество других вопросов/ответов. Но, как всегда, я бы посоветовал это: если для вас важны фактические числовые значения столбцов идентичности, вы делаете что-то неправильно. Они должны рассматриваться как непрозрачные капли, которые просто * бывают *, чтобы они могли вписаться в числовые столбцы. –

+0

Является ли ваш работодатель ОК с публикацией всей информации о вашем проекте на снимке экрана? Я могу видеть, для чего предназначен проект, схема базы данных, идентификаторы ... –

+0

Использование последовательностей в SQL Server 2012? –

ответ

6

Возможно по дизайну. Идентичность не гарантируется быть смежным и монотонным. Никто не может помочь, потому что никакой помощи не требуется. Приложения никогда не должны полагаться на личность, не имеющую пробелов. Значения строк значений 1,2, 100, 1000 всегда в порядке.

Как это возможно? Ну, для начала рассмотрим тривиальный случай DELETE. Очевидно, что удаление строк оставило бы пробелы.

Более тонкая проблема заключается в том, что появляются пробелы в тождествах, даже если их нет. Это происходит потому, что есть удаления, вы просто не знаете о них. Они вызваны отказом от несанкционированных транзакций. Откат не может быть предотвращен, так как запрет откатов - это akine, говорящий «Это всегда будет успешным!», Т.е. игнорируя реальность (неудачи). Отключение клиента в середине вставки - это откат, и вы никогда не сможете этого предотвратить.

Всегда ожидайте пробелов. Код ожидает пробелов. Никогда не полагайтесь на тождества, которые смежны.

Я бы использовать последовательность, чтобы решить эту проблему

последовательностям имеют точно та же самая проблема. Это не какой-то надзор над дизайном, это фундаментальная проблема: нет идеального способа генерации смежных идентификаторов без пробелов. Единственным решением является сериализация всех входов (например, блокировка таблицы X), и никто не хочет этого делать.

+0

Другими словами, если вы полагаетесь на идентификатор, являющийся хорошим значением, не используйте личность - просто управляйте идентификаторами самостоятельно, по-вашему. – Luaan

+2

@ Luaan: и как именно вы могли бы управлять идентификаторами «приятно», в присутствии DELETE и откатов? Это [безумное поручение] (http://en.wikipedia.org/wiki/Snipe_hunt). –

+0

О, да, полностью. Я больше в сценарии, что кажется, что у ОП есть какой-то тип вопроса, который, вероятно, упоминается где-то в коде. Если он ссылается на код (а не на динамический, модульный способ), было бы лучше просто иметь статический идентификатор, а не разрешать создавать новые. Итак, по крайней мере, другая таблица QuestionType, которая фактически говорит, что тип вопроса * * (и должен делать), а не просто один из MarketplaceID.Эта таблица будет недоступна для редактирования и привязана к коду. – Luaan

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