При добавлении записи в базу id не меняется.

Тема в разделе "Базы данных", создана пользователем web-investor, 1 ноя 2011.

Модераторы: latteo
  1. web-investor

    web-investor

    Регистр.:
    19 окт 2007
    Сообщения:
    501
    Симпатии:
    110
    Здравствуйте!

    Такой вопрос, у меня было в базе около 30 записей (в таблице). Я удалил 15 записей, переименовал id записей от 1 до 15, теперь когда добавляю новую запись она появляется с id=30+1, т.е. не по порядку 15, 16, 17 и т.д.
    Как сделать, чтобы при добавлении записи id шло попорядку?
     
  2. thoth777

    thoth777

    Регистр.:
    28 ноя 2008
    Сообщения:
    304
    Симпатии:
    98
    здравствуйте.
    в майадмине можно посмотреть свойства таблицы
    есть у нее такое свойство auto_increment

    так вот
    если вы удаляете записи с помощью delete, то значение автоинкремента не меняется и показывает # последней добавленной записи, даже если ее нет.

    поправьте это свойство у таблицы и все будет ок
     
    web-investor нравится это.
  3. web-investor

    web-investor

    Регистр.:
    19 окт 2007
    Сообщения:
    501
    Симпатии:
    110
    thoth777, а конкретно в phpmyadmin это можно увидеть? Дело в том, что я это все делал на денвере, далее сделал дамп базы и закачал на хостинг, там такая такая же беда. Похоже это значение автоинкремента переходит в дамп базы?
    -------------
    А, все нашел. Вот оно: "ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=34 ;" Спасибо!

    А можно сделать, чтобы при удалении записи автоинкремент тоже обновлялся?
     
  4. sympler

    sympler Постоялец

    Регистр.:
    24 окт 2008
    Сообщения:
    131
    Симпатии:
    6
    почему нет. можно. но только зачем?
    сколько работаю в этом надобности не видел, а вот новички все пытаются эту хрень реализовать, но когда спрашиваю зачем....
     
  5. thoth777

    thoth777

    Регистр.:
    28 ноя 2008
    Сообщения:
    304
    Симпатии:
    98
    что вы будете делать, если запись удалится не последняя, а предпоследняя, например?
    имхо, парить автоинкремент - зряшное занятие.
     
  6. bajun

    bajun Постоялец

    Регистр.:
    26 окт 2011
    Сообщения:
    67
    Симпатии:
    3
    согласен, зачем используете id? для уникальности записи. поэтому какая разница в его значении??и даже если будут "дырки" то на практике они могут даже пригодиться(в зависимости от назначения таблы)
     
  7. web-investor

    web-investor

    Регистр.:
    19 окт 2007
    Сообщения:
    501
    Симпатии:
    110
    Ситуация следующая, на сайте реализована перелинковка статей. Статьи линкуются по кругу, т.е. последняя на первую. Так вот, когда я поудалял лишние статьи, привел в порядок id (сделал по порядку от 1 до последнего), все стало нормально. Но когда добавил новую статью, у нее был id, больший, чем нужно (с учетом id удаленных статей), поэтому кольцо оборвалось.

    Сейчас залил новый дамп базы с измененным "ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=34 ;" стало все нормально.
     
  8. thoth777

    thoth777

    Регистр.:
    28 ноя 2008
    Сообщения:
    304
    Симпатии:
    98
    ггг
    мосье знает толк в извращениях!!!!!

    вот запросы вам:
    1. для первой статьи
    select * from table order by id ASC limit 1;
    2. для последней статьи
    select * from table order by id DESC limit 1;
    3. для следующей по списку статьи
    select * from table where id>__текущийID__ limit 1;
    4. для предыдущей по списку статьи
    select * from table where id<__текущийID__ limit 1;

    нет нужды извращаться с айдишниками, все решается средствами базы.
     
  9. web-investor

    web-investor

    Регистр.:
    19 окт 2007
    Сообщения:
    501
    Симпатии:
    110
    Через GET передается id статьи которую нужно вывести, она выводится, внизу появляется блок, в котором выводится предыдущая статья из базы (не вся статья, а заголовок, картинка и краткое описание). Вывод этой превьюшки делается следующим образом:
    Код:
    <? 
    $d=$id-1;    //id статьи на единицу меньше выведенной
    if ($d==0) {
    $kon= mysql_query ("select max(id) from data",$db);
    $myrow2 = mysql_fetch_array($kon);
    $b=$myrow2[0];
    $result = mysql_query("SELECT * FROM data WHERE id='$b'",$db);
    $myrow = mysql_fetch_array($result);
    echo "<img src='$myrow[mini_img]' alt='$myrow[alt]' />";
    echo "<a href='view.php?id=$myrow[id]'>$myrow[title]</a><br>";
    echo "$myrow[description]<br>";
    }
    else{
    $result = mysql_query("SELECT * FROM data WHERE id='$d'",$db);
    $myrow = mysql_fetch_array($result);
    echo "<img src='$myrow[mini_img]' alt='$myrow[alt]' />";
    echo "<a href='view.php?id=$myrow[id]'>$myrow[title]</a><br>";
    echo "$myrow[description]<br><br>";
    }
    ?>
    Как я понял метод не самый лучший ))

    Буду рад, если подскажите, что-то лучше.
     
  10. thoth777

    thoth777

    Регистр.:
    28 ноя 2008
    Сообщения:
    304
    Симпатии:
    98
    и подскажу.

    PHP:
    <?
    $d=$_GET['id']+0//получаем айдишник текущей статьи из гета.
    if ($d<2){
    //если айдишник меньше или равен единице, то берем последнюю
    $konmysql_query ("SELECT * FROM data order by id DESC limit 1",$db);
    статья
    }else{
    //если айдишник больше единицы
    $konmysql_query ("SELECT * FROM data WHERE id<".$d,$db); //берем предыдущую
    }

    //если предыдущий запрос не дал результата
    if (mysql_num_rows($kon)<1){
    $konmysql_query ("SELECT * FROM data order by id DESC limit 1",$db);
    }
    $myrow mysql_fetch_assoc($kon);
    echo 
    "<img src='".$myrow['mini_img']."' alt='".$myrow['alt']."' />";
    echo 
    "<a href='view.php?id=".$myrow['id']."'>".$myrow['title']."</a><br>";
    echo 
    $myrow['description']."<br><br>";


    ?>
    и дырки в нумерации - по барабану.
     
    web-investor нравится это.