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

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

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

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

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

С помощью:

ALTER TABLE [your table name here] AUTO_INCREMENT = 1 

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

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

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

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

 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 

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

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

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

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