Идентичность SQL Server Проблема - PullRequest
0 голосов
/ 07 января 2010

Я использую идентификатор на первичном ключе идентификатора. А потом я вставляю некоторые данные. Например.

Данные 1 -> Добавить успешно без ошибок. ID 1

Данные 2 -> Добавить успешно без ошибок. ID 2

Данные 3 -> Добавить ошибку с ошибкой.

Данные 4 -> Добавить ошибку с ошибкой.

Данные 5 -> Добавить успешно без ошибок. ID 5

Вы можете видеть, что ID вырос с 2 до 5.

Почему ?? Как можно это решить ??

Ответы [ 4 ]

3 голосов
/ 08 января 2010

С чем это может быть проблемой?

Обычно вы будете использовать идентификатор в столбце первичного ключа. Тогда этот первичный ключ является суррогатным ключом, что означает, что он не имеет абсолютно никакого значения для бизнеса / делового значения. Это просто «административный» факт, который необходим для того, чтобы база данных могла однозначно идентифицировать запись. Таким образом, не имеет значения, что это за значение; и это также не имеет значения, что есть пробелы. Почему вы хотите, чтобы они были последовательными?

И, предположим, что они являются последовательными - что при неудачной вставке пропуски не появляются - что бы вы сделали, если удалили строку и вставили ее позже? Не могли бы вы также заполнить пробелы?

0 голосов
/ 08 января 2010

@ Фредерик ответил на большинство из них - я бы просто добавил, что вы смешиваете первичные ключи и бизнес-ключи. Счет-фактура (или любой другой) должен быть идентифицирован номером счета-фактуры - бизнес-ключом, который должен иметь в таблице столбец UNIQUE. Первичный ключ здесь для идентификации строки в таблице и должен использоваться базой данных (для присоединения ..) и только администраторами баз данных.

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

0 голосов
/ 08 января 2010

Если вставка не удалась, для следующей вставки вы можете использовать установить identity_insert mytable на и вычислить следующую идентичность вручную, используя max (myfield) +1. У вас могут быть проблемы с параллелизмом.

Но это клочок. С пробелами все в порядке.

0 голосов
/ 07 января 2010

это по замыслу, сервер sql сначала увеличивает счетчик, а затем пытается создать строку, если в случае неудачной транзакции (всегда есть неявные транзакции) выполняется откат, но значение автоинкремента не используется повторно. это сделано специально, и я был бы очень удивлен, увидев, что этого можно избежать (в конце концов вы можете вызвать некоторую команду и сбросить значение до текущего максимума). Вы всегда можете использовать триггер, чтобы сгенерировать эти значения, но это влияет на производительность, обычно вам не нужно заботиться о значении auto_increment, представляющем собой просто целое число, у вас будет такая же ситуация позже в вашем приложении, если th

...