Переиндексация базы MySQL

Статус
В этой теме нельзя размещать новые ответы.

neto

Хранитель порядка
Регистрация
7 Дек 2007
Сообщения
951
Реакции
528
Переиндексация базы MySQL

Точнее переинкрементация :) сброс..
с учетом последних записей в базе..

т.е. постоянно удаляются данные из базы..
) ENGINE=MyISAM AUTO_INCREMENT=1110
а авто-инкрементация растет..

Есть ли простой способ/скрипт делать это в движке ?
либо простенкий код.. для вставки в админку.. (для для всей базы!)
 
Подскажите куда эту команду вставить в таблице базы ?

Сброс счетчика AUTO_INCREMENT в MySQL

Что бы установить счетчик AUTO_INCREMENT в 0, достаточно выполнить команду:

ALTER TABLE <table_name> SET AUTO_INCREMENT=0;

Только замените на имя вашей таблицы.

Полдня шарил инет.. ничего не нашел (образец таб)

ALTER TABLE <table_name> SET AUTO_INCREMENT=0;

Вот на этом примере куска базы покажите: (т.е. куда вписать команду ?)

DROP TABLE IF EXISTS `cms_articles`;
CREATE TABLE `cms_articles` (
`article_id` int(11) NOT NULL auto_increment,
`category_id` int(11) default NULL,
`article_title` varchar(255) default NULL,
`article_url` varchar(255) default NULL,
`article_author` varchar(255) default NULL,
`article_source` varchar(255) default NULL,
`article_summary` text,
`article_text` text,
`article_date_from` int(11) default NULL,
`article_date_to` int(11) default NULL,
`article_status` tinyint(1) default '0',
`article_no_word` int(11) NOT NULL default '0',
PRIMARY KEY (`article_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1110 DEFAULT CHARSET=utf8;
 
Если надо сделать так, чтобы id статьи при создании базы начинался с 0, то:
CREATE TABLE `cms_articles` (
`article_id` int(11) NOT NULL auto_increment,
`category_id` int(11) default NULL,
`article_title` varchar(255) default NULL,
`article_url` varchar(255) default NULL,
`article_author` varchar(255) default NULL,
`article_source` varchar(255) default NULL,
`article_summary` text,
`article_text` text,
`article_date_from` int(11) default NULL,
`article_date_to` int(11) default NULL,
`article_status` tinyint(1) default '0',
`article_no_word` int(11) NOT NULL default '0',
PRIMARY KEY (`article_id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

Если из базы все удалили и необходимо, чтобы id статей снова начианался с 0, то
ALTER TABLE cms_articles SET AUTO_INCREMENT=0;
Эта комманда вводится прямо как есть. При работе с консоли необходимо:
1. mysql -uuser -ppassword ваша_база
2. ALTER TABLE cms_articles SET AUTO_INCREMENT=0;
 
Ad1ce ..в navicat'е есть поддержка консоли mysql
есть ли возможность целиком всю базу сбросить ?
(не удаляя существующие записи, только их счёт!)
если есть.. распиши подробно шаги..
чтоб не по отдельности каждую таблицу
в консоли мускула сбрасывать счетчик..
...
если же ты хочешь сразу после удаления ВСЕХ данных, чтобы скидывался
на начало и инкремент то для удаления всей инфы используй:

TRUNCATE TABLE table_name;

тоже через консоль вводится ?
 
Ну если в навикате есть консоль, то можно и через нее далать.
Я с навикатом не работал, однако всё, что делается через mysql можно сделать и через навикат.
Насчет TRUNCATE:
Если необходимо полностью удалить все данные и параметры таблицы, то просто вводи команду
TRUNCATE TABLE table_name;
есть ли возможность целиком всю базу сбросить ?
(не удаляя существующие записи, только их счёт!)
Что значит существующие записи? Если это данные, то сбрасывать автоинкремент - опасно, так как новые данные не буду добавляться, так как будет дублирование id. Если необходимо, то тут надо найти запись с максимальным id и от нее продолжать инкремент.
В любом случае, для всей базы нельзя сбросить инремент, только для каждой таблицы в отдельности.
 
Код:
ALTER TABLE <table_name> SET AUTO_INCREMENT=0;
Данная команда не годится для вас,тк после этого будет ошибка, нужно вычислит последний INCREMENT записей и сделать ту же команду
ALTER TABLE <table_name> SET AUTO_INCREMENT=;
вот примерно так:
подключаемся к базе
PHP:
$query = "SELECT MAX(article_id) FROM cms_articles";//вычисляем последний ид записи
  $mtb = mysql_query($query);
  $max_value = mysql_result($mtb, 0);
  $max_value = $max_value+1;//добавляем 1 к макс. значению.
$set= "ALTER TABLE cms_articles SET AUTO_INCREMENT=".$max_value;
mysql_query($set);
 
Придется всю базу чистить.. :( в ручную (от записей)
обнулять её (в смысле = 1) и по новой в движке заносить
записи в "новую" базу с правильными авто-инкрементами..
...
Такой вопрос.. как эту беду (в коде) в движке настроить ?
т.е. когда база растет да 10к записей.. и в процессе удаляются
из неё записи.. (много!) и она имеет примерно такой вид:

DROP TABLE IF EXISTS `cmf_modules`;
CREATE TABLE `cms_modules` (
`module_id` int(11) NOT NULL auto_increment,
`module_name` varchar(127) default NULL,
`module_position` int(11) default NULL,
`module_type` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`module_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1000143 /*!40101 DEFAULT CHARSET=utf8 */;

INSERT INTO `cmf_modules` VALUES
(12, 'structure', 0, 0),
(13, 'textblocks', 4, 0),
(14, 'articles', 1, 0),
(16, 'news', 2, 0),
(17, 'administrators', 11, 0),
(23, 'polls', 3, 0),
(20, 'banners', 6, 0),
(21, 'contacts', 9, 0),
(22, 'sitemap', 10, 0),
(28, 'forum', 12, 0),
(29, 'users', 13, 0),
(31, 'modules', 14, 0),
(32, 'releases', 15, 0),
(33, 'boards', 16, 0),
(34, 'action', 17, 0),
(35, 'print', 18, 0),
(36, 'cat', 19, 0),
(37, 'shop', 20, 0),
(38, 'products', 21, 0),
(39, 'search', 23, 0),
(40, 'sales', 24, 0),
(1000142, 'catalogs', 500, 0);[/spoil]
то можно ли в движке через скрипт
сделать принудительную авто-инкрементацию
чтоб она приняла такой вид:
[spoil]DROP TABLE IF EXISTS `cmf_modules`;
CREATE TABLE `cms_modules` (
`module_id` int(11) NOT NULL auto_increment,
`module_name` varchar(127) default NULL,
`module_position` int(11) default NULL,
`module_type` tinyint(1) NOT NULL default '0',
PRIMARY KEY (`module_id`)
) ENGINE=MyISAM AUTO_INCREMENT=25 /*!40101 DEFAULT CHARSET=utf8 */;

INSERT INTO `cmf_modules` VALUES
(2, 'structure', 0, 0),
(3, 'textblocks', 4, 0),
(4, 'articles', 1, 0),
(6, 'news', 2, 0),
(7, 'administrators', 11, 0),
(8, 'polls', 3, 0),
(9, 'banners', 6, 0),
(10, 'contacts', 9, 0),
(11, 'sitemap', 10, 0),
(12, 'forum', 12, 0),
(13, 'users', 13, 0),
(14, 'modules', 14, 0),
(15, 'releases', 15, 0),
(16, 'boards', 16, 0),
(17, 'action', 17, 0),
(18, 'print', 18, 0),
(19, 'cat', 19, 0),
(20, 'shop', 20, 0),
(21, 'products', 21, 0),
(22, 'search', 23, 0),
(23, 'sales', 24, 0),
(24, 'catalogs', 500, 0);

т.е. "переиндексация" всей базы..
из самого движка..

PHP код:
$query = "SELECT MAX(article_id) FROM cms_articles";//вычисляем последний ид записи
$mtb = mysql_query($query);
$max_value = mysql_result($mtb, 0);
$max_value = $max_value+1;//добавляем 1 к макс. значению.
$set= "ALTER TABLE cms_articles SET AUTO_INCREMENT=".$max_value;
mysql_query($set);

это ведь для одной таблицы..

а как спрограмить для всей базы ?
 
делаете тоже самое только изменяя параметры
article_id и cms_articles и все,только не понимаю зачем вам это,никак это не влияет на производительность и тд...
 
только не понимаю зачем вам это

слегка отдает параноей.. :) да ?
нет.. просто все id отражаются в админке движка
и мну раздражает.. что они идут не по порядку.. :confused:
...
Еще такой момент.. а как быть со вторым
(допустим третим, если есть) id в таблице
`article_id` int(11) NOT NULL auto_increment,
`category_id` int(11) default NULL, <----

как у неё тоже выровнять счёт ?
или тут только ручками..
 
Можно сделать так. После удаления большого числа записей запускать вручную скрипт на php:
1. делаем Select id from table, выбираем все id, которые надо переназначить
2. цикл по всем записям for ($i=0;$<кол-во записей;$i++)
3. Update table set id=$i+1
4. Конец цикла
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху