Идентичность увеличивается, только если вставлена ​​запись - PullRequest
1 голос
/ 05 мая 2009

sql server 2005: у меня есть столбец empid в таблице сотрудников с идентификатором on.if при вставке данных в таблицу возникает ошибка. Идентичность увеличивается. Я хочу, чтобы идентификатор увеличивался, только если вставлена ​​запись. Например, если у меня есть сгенерированный emp id от 1 до 5, а затем при 6-й ошибке вставки записи ocurrs.and при следующей вставке записи значение идентификатора будет равно 7. Я хочу, чтобы оно было 6.

Ответы [ 4 ]

2 голосов
/ 05 мая 2009

Почему вы хотите это сделать?

Столбец идентификации следует использовать только как «внутреннее административное значение» для базы данных, и он не должен иметь «бизнес-ценности», так почему же важно, чтобы в этой последовательности были пробелы?
Если идентификация используется правильно, то пользователи вашего программного обеспечения никогда не столкнутся со столбцом, который имеет значение идентификатора; вы просто используете его для уникальной идентификации записи.

1 голос
/ 05 мая 2009

Какая уважительная деловая причина у вас есть для ухода, если есть пробелы? У базы данных нет причин для беспокойства, и у каждого основания быть уверенным, что значения идентичности никогда не используются повторно для чего-то другого, поскольку они могут вызвать серьезные проблемы с целостностью данных при поиске информации на основе старых отчетов и т. Д. Предположим, у вас есть отчет, который показывает заказы в прошлом месяце, а затем вы удаляете одну из записей, потому что клиент был продублирован и таким образом дедуплирован. Затем вы повторно используете поле идентификации для удаленного клиента, который был удален. Теперь кто-то ищет отчет за прошлый месяц, чтобы найти клиента 12345, и данные, связанные с этим cuisotmer, принадлежат Джону Смиту, а не Салли Джонс. Но человек не знает, что, поскольку он использует агреагат, теперь у него неверная информация, которую можно было полностью избежать. Если бы она искала удаленного клиента, процесс вместо этого мог бы перенаправить ее на правильного клиента, оставшегося после дедупликации.

1 голос
/ 05 мая 2009

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

edit: Даже откат неудачных транзакций не приведет к уменьшению количества идентификаторов, это задуманно, см. этот другой вопрос .

0 голосов
/ 05 мая 2009

Когда вам нужно это специфическое поведение, вы должны использовать хранимые процедуры для генерации идентификатора. Таким образом, вы можете действительно откат. Но имейте в виду, что текущее поведение является целью. Изоляция транзакций и различные уровни чтения (грязное чтение), скорее всего, доставят вам неприятности, если вы не используете блокировку для этого поля идентификатора в таблице основных данных, в которой хранится текущее или следующее значение идентификатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...