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

Тема в разделе "Базы данных", создана пользователем neto, 17 дек 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. neto

    neto

    Регистр.:
    7 дек 2007
    Сообщения:
    957
    Симпатии:
    493
    Переиндексация базы MySQL

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

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

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

    neto

    Регистр.:
    7 дек 2007
    Сообщения:
    957
    Симпатии:
    493
    Подскажите куда эту команду вставить в таблице базы ?

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

    ALTER TABLE <table_name> SET AUTO_INCREMENT=0;

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

     
  3. Ad1ce

    Ad1ce Постоялец

    Регистр.:
    18 авг 2009
    Сообщения:
    110
    Симпатии:
    25
    Если надо сделать так, чтобы 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;
     
  4. neto

    neto

    Регистр.:
    7 дек 2007
    Сообщения:
    957
    Симпатии:
    493
    Ad1ce ..в navicat'е есть поддержка консоли mysql
    есть ли возможность целиком всю базу сбросить ?
    (не удаляя существующие записи, только их счёт!)
    если есть.. распиши подробно шаги..
    чтоб не по отдельности каждую таблицу
    в консоли мускула сбрасывать счетчик..
    ...
    тоже через консоль вводится ?
     
  5. Ad1ce

    Ad1ce Постоялец

    Регистр.:
    18 авг 2009
    Сообщения:
    110
    Симпатии:
    25
    Ну если в навикате есть консоль, то можно и через нее далать.
    Я с навикатом не работал, однако всё, что делается через mysql можно сделать и через навикат.
    Насчет TRUNCATE:
    Если необходимо полностью удалить все данные и параметры таблицы, то просто вводи команду
    TRUNCATE TABLE table_name;
    Что значит существующие записи? Если это данные, то сбрасывать автоинкремент - опасно, так как новые данные не буду добавляться, так как будет дублирование id. Если необходимо, то тут надо найти запись с максимальным id и от нее продолжать инкремент.
    В любом случае, для всей базы нельзя сбросить инремент, только для каждой таблицы в отдельности.
     
  6. swer

    swer

    Регистр.:
    15 июн 2008
    Сообщения:
    308
    Симпатии:
    38
    Код:
    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($mtb0);
      
    $max_value $max_value+1;//добавляем 1 к макс. значению.
    $set"ALTER TABLE cms_articles SET AUTO_INCREMENT=".$max_value;
    mysql_query($set);
     
  7. neto

    neto

    Регистр.:
    7 дек 2007
    Сообщения:
    957
    Симпатии:
    493
    Придется всю базу чистить.. :( в ручную (от записей)
    обнулять её (в смысле = 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);

    то можно ли в движке через скрипт
    сделать принудительную авто-инкрементацию
    чтоб она приняла такой вид:
    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);


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

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

    а как спрограмить для всей базы ?
     
  8. swer

    swer

    Регистр.:
    15 июн 2008
    Сообщения:
    308
    Симпатии:
    38
    делаете тоже самое только изменяя параметры
    article_id и cms_articles и все,только не понимаю зачем вам это,никак это не влияет на производительность и тд...
     
  9. neto

    neto

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

    как у неё тоже выровнять счёт ?
    или тут только ручками..
     
  10. Ad1ce

    Ad1ce Постоялец

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