Достижение конца пула значений для автоматически сгенерированных (IDENTITY) полей - PullRequest
0 голосов
/ 13 июня 2011

Большинство баз данных поддерживают autogenerate для поля INT, в основном используется в качестве ключа для этой таблицы.Иногда для краткости ему присваивается имя id.

сколько времени до того, как программа скажет, что c # int и значение базы данных INT больше не поддерживают друг друга, или как долго, прежде чем значение INTизрасходовано или насколько велико это автоматически сгенерированное поле идентификатора для базы данных, скажем, sqlite?

Когда вы пытаетесь вставить новую запись, и автоматически сгенерированный идентификатор строки базы данных используется, что происходит;больше нет вставки?

спасибо

[РЕДАКТИРОВАТЬ]

Вы время от времени смотрите на значения ID ваших таблиц?

Большинство людей не понимаютНе знаю, что если по какой-то причине ваше приложение выполняет много операций вставки и удаления, то при каждом добавлении генерируется новое значение ID.Похоже, что базы данных не используют повторно удаленные ID, поэтому в этом случае база данных, содержащая только 1000 записей, может использовать это значение, если приложение выполняет много операций вставки и удаления !!!

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

чтобы не сказать, что я сделал что-то подобное

int record_id= reader("id").value;

когда я получу ошибку переполнения?база данных INT совпадает с int во всех программных средах?

Ответы [ 2 ]

4 голосов
/ 13 июня 2011

Я не знаю, что такое sqlite, но для SQL Server максимальные значения выглядят так:

max int (32 bit) = 2,147,483,647
max bigint (64 bit) = 9,223,372,036,854,775,807

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

Ошибка арифметического переполнения при преобразовании IDENTITY в тип данных int.Произошло арифметическое переполнение.

Опять же, понятия не имеем о sqlite, но в SQL Server неудачные транзакции также будут использовать значение из пула.Если вы попытаетесь выполнить вставку и откат транзакции будет выполнен, то сгенерированное значение IDENTITY не будет возвращено в пул.Если у вас регулярно происходят неудачные транзакции, это также приведет к потере определенного (хотя и очень небольшого) процента значений.

Скорее всего, sqlite работает аналогичным образом.

2 голосов
/ 13 июня 2011

Максимальный размер INT в SQLite составляет 8 байтов, что является очень, очень большим числом. Мне трудно представить приложение, использующее SQLite, где вы могли бы на самом деле «исчерпать» INT. Для этого вам нужно будет запустить очень большую систему хранения данных, чего вы не собираетесь делать с SQLite. Так что не волнуйся!

...