Как повторно использовать удаленные первичные ключи в mysql?

У меня есть столбец с именем 'id' в таблице mysql, который также является первичным ключом, который автоматически увеличивается.

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

1, 2, 3, 9, 10, 30 и т.д.

существует ли способ повторного использования этих удаленных идентификаторов: s?

Ответ 1

Использование:

ALTER TABLE [your table name here] AUTO_INCREMENT = 1

... будет reset значение auto_increment будет следующим, основанным на самом высоком существующем значении, существующем в таблице. Это означает, что он не может использоваться для исправления пробелов более чем одного.

Единственная причина для этого - косметические - в базе данных все равно, если записи последовательны, а только то, что они соотносятся друг с другом последовательно. Нет необходимости "корректировать" значения радианта базы данных.

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

Ответ 2

Используйте bash script, чтобы переименовать их (это невероятно медленно и неэффективно, если у вас большая база данных). После того, как вы закончите, как указано ранее, используйте ALTER TABLE для reset следующий ключ, который будет используется

TARGET=1
for KEYS in `mysql --skip-column-names -u root --password=Password -D lookup -e "select id from tbl"` ; do
  mysql --skip-column-names -u root --password=Password -D lookup -e "update tbl set id='$TARGET' where id = '$KEYS'"
  TARGET=`expr $TARGET + 1`
  echo $TARGET
done

Ответ 3

У вас есть два варианта:

  • вручную укажите идентификатор (это автоматически отключает авто).
  • TRUNCATE таблица - это приведет к удалению всех записей в таблице

Это всегда плохая идея повторного использования "дыр", созданных удалением строк, на это был дан ответ, прежде чем здесь, в SO, но я слишком сонлив сейчас, чтобы пойти и найти этот вопрос.

Ответ 4

Вы можете попробовать "ALTER TABLE t2 AUTO_INCREMENT = 1;"