Прежде всего, вам нужна веская причина, по которой вы хотите добиться повторного использования удаленных идентификаторов.
Первичный ключ предназначен для уникальной идентификации записи. Период. Это не из-за личных предпочтений людей в отображении или из-за того, что нет, это из-за реальной, веской логической причины - поэтому он называется первичный ключ .
Откровенно говоря, какой смысл? Значение id
равно 1 или 201321941 не имеет значения для компьютера. Если вы думаете, что «некрасиво» иметь пробелы после удаления чего-либо, вам нужно изменить свою логику и прекратить использовать auto_increments или хотя бы соответствовать им.
Первое, что вам нужно знать, это то, что вы никогда никогда не хотите вмешиваться в auto_increment
.
Почему?
Прежде всего, auto_increment
всегда используется для первичного ключа с таблицами MySQL, и, следовательно, это суррогатный первичный ключ, который означает, что MySQL определяет, как его сгенерировать физически. Если вы добавите человеческий фактор к алгоритму, который имеет дело с чувствительными вещами (например, всегда правильно генерирует следующее целое число для конкретной таблицы, принимая транзакции и что не учитывается) - вы получите катастрофу.
Во-вторых, для некоторых механизмов, таких как InnoDB, первичный ключ определяет физический порядок хранения данных. Что это значит? Скажем, у вас есть 1 миллион записей в вашей таблице, и способ, которым InnoDB хранит данные, заключается в добавлении самой последней записи в файл данных, поскольку каждый следующий идентификатор больше предыдущего. Затем вы, скажем, удалите число 500 000, и вы хотите использовать его повторно. Это означает, что физически InnoDB должен вставить запись в строку 500 000 (упрощенное объяснение) и переупорядочить b-дерево, чтобы соответствовать изменению, которое намного дороже, чем просто добавление данных.
Есть и другие причины, которые я действительно не хочу сейчас упоминать, но если вы хотите какой-то последовательный порядок или отображение ваших идентификаторов - тогда создайте другое поле под названием sequence_id или что-то подобное и создайте триггер, который будет правильно справиться с этим (увеличить или уменьшить).
В противном случае, не делайте то, что может причинить вам боль.