Используются ли числовые первичные ключи удаленных записей в базе данных для будущих новых записей? - PullRequest
5 голосов
/ 31 октября 2008

Например, если у меня есть поле с автоматической нумерацией, я добавляю новые записи без указания этого поля и позволяю механизму БД выбрать его для меня.
Итак, он выберет номер удаленной записи? Если да, то когда?

// SQL Server, MySQL. //

Дополнительный вопрос: Что происходит, когда в двигателе БД не хватает чисел, используемых для первичных ключей?

Ответы [ 11 ]

14 голосов
/ 31 октября 2008

NO. числовые первичные ключи не будут повторно использоваться, за исключением того, что вы указываете их вручную (вам действительно следует избегать этого!)

8 голосов
/ 31 октября 2008

AFAIK, это может произойти в MySQL:

Как работает обработка AUTO_INCREMENT в InnoDB :

InnoDB использует счетчик автоинкремента в памяти, пока работает сервер. Когда сервер останавливается и перезапускается, InnoDB повторно инициализирует счетчик для каждой таблицы для первого INSERT в таблицу, как описано ранее.

После перезагрузки сервера. Innodb повторно использует ранее сгенерированные значения auto_increment.

Предлагаемое исправление: Таблица innodb не должна терять след следующего номера для столбца auto_increment после перезапускать.

2 голосов
/ 31 октября 2008

Как правило, нет, номера не используются повторно.

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

Является ли это число удаленных записей или нет, это проблема ваших приложений.

2 голосов
/ 31 октября 2008

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

1 голос
/ 31 октября 2008

MySQL не будет повторно использовать идентификаторы, если вы не truncate таблица или delete from таблица без предложения where (в этом случае MySQL внутренне просто делает truncate).

1 голос
/ 31 октября 2008

Пока вы правильно создаете таблицу, вы не будете повторно использовать числа. Однако вы можете СБРОСИТЬ столбец идентификаторов (В любом случае, в MSSQL), используя следующее:

- введите номер последней действительной записи в таблице, а не следующий номер, который будет использоваться

Проверка подлинности DBCC ([TableName], RESEED, [NumberYouWantToStartAt])

Это, конечно, безумие ... и никогда не должно быть сделано:)

1 голос
/ 31 октября 2008

Этот вопрос необходимо уточнить:

... "с последовательностями Oracle"

... "с колонками автонумерации MySQL"

... и т.д ...

1 голос
/ 31 октября 2008

Не специально. Если ключ читается из последовательности или столбца идентификаторов с автоинкрементом, последовательность просто подключится и выдаст следующее значение. Однако вы можете деактивировать это (set identity_insert on на SQL Server) и поместить любое нужное число в столбец, если это не нарушает ограничение уникальности.

0 голосов
/ 10 сентября 2010

нет, представьте, если ваш банк решил повторно использовать ваш account_id - arghhhh !!

0 голосов
/ 30 октября 2009

Я считаю "особенность" MySQL повторного использования идентификаторов ошибкой.

Рассмотрим что-то вроде обработки загрузки файлов. Рекомендуется использовать идентификатор базы данных в качестве имени файла: просто, нет риска эксплойтов с предоставленными пользователем именами файлов и т. Д.

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

Если такая проблема возникает, и первое, что сервер делает при возврате, перезаписывает идентификаторы и, следовательно, файлы откатанных транзакций, это отстой. Эти файлы могли быть полезны.

...