Задавайте вопросы, мы ответим
Вы не зашли.
В общем вопрос такой:
Существует некая таблица с полем к примеру `id` bigint(20) NOT NULL auto_increment (к примеру строк 500)
Так вот, после выполнения (опять же к примеру )) DELETE FROM some_table WHERE some_table.id=12, у меня остаются в этой таблице id со следующими значениями: 1,2,.... 11,13,.... Так вот вопрос - можно ли заставить БД саму пересчитывать id, чтобы избавиться об образовавшейся "бреши"??
Неактивен
ALTER TABLE some_table MODIFY `id` bigint(20) NOT NULL;
ALTER TABLE some_table DROP PRIMARY KEY;
UPDATE some_table SET id=0;
ALTER TABLE some_table MODIFY `id` bigint(20) NOT NULL auto_increment PRIMARY KEY;
Но это извращение. И выдаст ошибку в случае если установлен режим NO_AUTO_VALUE_ON_ZERO.
Возникает вопрос, а зачем это вообще нужно?
Неактивен
Я бы на вашем месте завел в таблице отдельное поле для сквозной нумерации, заполнить его можно с помощью специальной процедуры.
Удалять записи также лучше бы не напрямую, а при помощи еще одной процедуры, которая после удаления стала бы пересчитывать значение поля-счетчика для нужных записей.
Эти задачи можно реализовать также и по-другому, если использовать в качестве клиентов программы на других языках программирования (php, perl и др.)
Неактивен
LazY написал:
Эти задачи можно реализовать также и по-другому, если использовать в качестве клиентов программы на других языках программирования (php, perl и др.)
у меня как раз и написал скрипт на пхп, который удаляет а потом всё это дело пересчитывает... просто есть некоторые ограничения по его размеру, и хотелось поинтересоваться можно ли обозначенную задачу решить силами самой бд.... обидно что лёгкого решения этой вроде как простенькой задачи нема ))) - оставлю тоды всё как есть...
Всем спасибо )
Неактивен
Очень даже можно и средствами БД.
Для этого нужно сделать несколько несложных вещей (SQL-код, приводимый ниже, можно тупо вставлять в клиент и выполнять - только вставить нужные имена таблицы и столбцов; все пояснения находятся внутри комментариев).
Не стесняйтесь задавать вопросы.
Итак, нужно:
1. Добавить в таблицу столбец, который будет хранить счетчик:
Неактивен
2LazY
Ух... спасибо!!! мощно!!! ща сижу разбираюсь!
Неактивен
Отличное решение, спасибо LazY огромное за подсказку! Использую теперь постоянно в работе.
Только вот обратил внимание что если вызывать функцию CALL del_from_some_table(x), то не всегда происходит пересчет строк, приходится дополнительно пересчитывать второй функцией. Чем это может быть вызвано?
Неактивен