Как повторно использовать удаленные первичные ключи в 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;"