Вот допустим есть несколько таблиц в которых используются автоинкрементные идентификаторы. Между таблицами активно используются внешние ключи, контроль ссылочной целостности (но отключить базу ненадолго можно). Подобавляли элементов, часть из них поудаляли, работаем дальше, в порядке нумерации появились "дыры". Надо уменьшить все айдишники (и счётчик для следующего нового айдишника) так, чтобы нумерация снова стала непрерывной.
Как это сделать (кроме очевидного варианта с написанием собственной программы, которая будет делать всё это "вручную")?
Вопрос "зачем это надо?" оставим в оффтопиках, понятно что не надо такое почти никогда, особенно в продакшене, но всё же интересно, в определённых контекстах смысл есть.
Триггерами, наверное. И неплохо было бы спрашивать у бд перед записью нового поля о номере наибольшего предыдущего и присваивать следующий.
Программы не получится, получится mysql функция на пару строк.
Я имею ввиду разовую операцию. БД/приложение - не моё (в смысле не моей разработки), менять логику кода приложения - не вариант. Постоянно поддерживать непрерывность нумерации не нужно. Надо просто один (условно) раз взять, "утрамбовать", и работать дальше в обычном режиме.
Выглядит жутковато. Даже если это возможно сделать с непустой таблицей (не знал, что может существовать таблица без первичного ключа) и даже если после создания первичного ключа заново установленные ранее в ноль номера пересчитаются, тут ничего нет об обновлении значений ссылающихся на эту таблтцу внешних ключей. Может и прокатит конечно если там стоит что-то типа ON UPDATE CASCADE, попробую.
У вас не будет случайного обращения к удалённой записи и вместо удалённой в одном месте выдаст другую а из-за того что все сдвинутся всё не перепутается? В CMS, например, это так ))
А почему так должно получиться если мы меняем все первичные ключи и соответственно этим изменениям обновляем все внешние? СMS-ки хранят эти айдишники где-то ещё?
@StrangeAttractor например я на вас на своём сайте поставил ссылку yousite.ru/folder/123 и назвал её ЖК телевизоры, а вы id 123 снесли её или сделали фены. Что подумает посетитель перейдя с моего сайта на ваш?
@marrk2 а, да это пофиг, никаких ссылок гарантированно нет, естественено я не стал бы делать ничего такого на публичном продакшене. Я думал вы имеете ввиду, что в результате такой операции yousite.ru/folder/123 будет ссылаться на документ с айдишиком 234, например.