Что происходит с автоинкрементами первичных ключей после удаления? - PullRequest
5 голосов
/ 04 марта 2011

Я пытаюсь создать файл базы данных с объектами и подобъектами.Например,

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

Вторая таблица будет содержать монеты.Каждая монета будет иметь идентификатор (необходим?), А также идентификатор банка, в котором она содержится, и ее данные (например, стоимость, год и т. Д.).

Мой вопрос: что происходит савтоинкрементные ключи когда один удаляется?Скажем, у вас было 4 банки:

1 2 3 4

и вы удалили номер 2. Будут ли перенумерованы оставшиеся банки 123?или будет разрыв?Если есть пробел, заполняется ли он, чтобы следующий созданный сосуд имел идентификатор 2?или следующий будет 5?

Спасибо

Ответы [ 2 ]

8 голосов
/ 04 марта 2011

Вы можете прочитать об этом в sqlite AUTOINCREMENT docs:

Обычный алгоритм - дать вновь созданной строке ROWID, который на один больше, чем самый большой ROWID втаблица до вставки.Если таблица изначально пуста, то используется ROWID, равный 1.Если наибольший ROWID равен наибольшему возможному целому числу (9223372036854775807), то ядро ​​базы данных начинает выбирать случайные ROWID-кандидаты случайным образом, пока не найдет тот, который ранее не использовался.Если после разумного числа попыток не может быть найдено неиспользованного ROWID, операция вставки завершается неудачно с ошибкой SQLITE_FULL.

Короче говоря, после вставки 4 строк, удаления второй, а затем вставки другойв конце, идентификаторы будут:

1 3 4 5

1 голос
/ 04 марта 2011

Зависит от реализации базы данных. Например, MySQL инициализирует счетчик автоинкрементов при запуске сервера и затем сохраняет номер автоинкремента в памяти. Таким образом, если вы добавите 10 строк в пустую таблицу, а затем удалите их, все следующие числа автоинкремента будут 11, а не 1.

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