У меня есть столбец с именем '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
У вас есть два варианта:
TRUNCATE
таблица – это приведет к удалению всех записей в таблице Это всегда плохая идея повторного использования «дыр», созданных удалением строк, на это был дан ответ, прежде чем здесь, в SO, но я слишком сонный прямо сейчас, чтобы пойти и найти этот вопрос.
Вы можете попробовать «ALTER TABLE t2 AUTO_INCREMENT = 1;»