Jump to content
  • 0

При удалении, id прибавляет значение


rus
 Share

Question

Уж и не знаю, правильно ли выбрал раздел, суть в следующем:

В таблице существуют некие поля (в том числе и id):

id | title | text

—————--

1 | test | test

Удаляем все записи.

Потом опять делаем запись и что мы видим:

id | title | text

—————--

2 | test | test

Вопрос: а куда делась единица?

Почему при перезаписи, id увеличивается, а не делает возврат?

Link to comment
Share on other sites

21 answers to this question

Recommended Posts

  • 0
Уж и не знаю, правильно ли выбрал раздел, суть в следующем:

В таблице существуют некие поля (в том числе и id):

Вопрос: а куда делась единица?

Почему при перезаписи, id увеличивается, а не делает возврат?

Записи как удаляете ? по одной ? индексы удаляются только при drop table

перезапись ? это update .

а если insert то это вы добавляете новую и инкремент срабатывает

Link to comment
Share on other sites

  • 0

Возможно, потому чо при этом не нужно анализировать состояние таблицы в базе, не нужно просчитывать, есть ли свободные ID. Просто берем следующий.

К тому же это потенциально могло бы нарушить целостность базы. Раньше по этому ID была одна запись, потом с базой поработали, и вот уже с этим ID другая запись. Скорее всего, это и есть основная причина.

Link to comment
Share on other sites

  • 0
Записи как удаляете ? по одной ? индексы удаляются только при drop table

перезапись ? это update .

а если insert то это вы добавляете новую и инкремент срабатывает

Да, верно, операция инсерт по добавлению новой инфы.

То есть:

1) было скажем 12345 id

2) добавил новую инфу стало 123456 id

3) потом удалил один id, стало опять 12345 id

4) опять добавил инфу и стало 123457

З.Ы. если добавление новой инфы лучше в этом случае апдейт, тогда перезапись таблицы тоже апдейт?

Edited by rus
Link to comment
Share on other sites

  • 0
Да, верно, операция инсерт по добавлению новой инфы.

То есть:

1) было скажем 12345 id

2) добавил новую инфу стало 123456 id

3) потом удалил один id, стало опять 12345 id

4) опять добавил инфу и стало 123457

З.Ы. если добавление новой инфы лучше в этом случае апдейт, тогда перезапись таблицы тоже апдейт?

2) стало не 123456, а 12346

3) стало 12345 - последний существующий

4) стало 12347

добавление новой инфы (insert) - это добавление, а апдейт (update) - это замена

перезапись таблицы, это как ?

drop table

create table

Link to comment
Share on other sites

  • 0
Возможно, потому чо при этом не нужно анализировать состояние таблицы в базе, не нужно просчитывать, есть ли свободные ID. Просто берем следующий.

Это и не происходит.

Вот код:

$r = mysql_query ("SELECT * FROM articles");
$num = mysql_num_rows($r);
if(isset($_GET['id'])){
$id = ($_GET['id']<=$num) ? true : false;
if(!$id){
echo "Неправильный id!";
}else{
$id=(int)$_GET['id'];
}
}

По ссылке показывает правильный id (например 7), в базе он есть, но при клике утверждает что нет такой записи.

Подставляешь id = 1 и он не ругается, но и не выдает нужной записи, так как ее просто нет в базе, так как в базе только запись с id 7

<a href="edit_articles.php?id='.$myrow['id'].'">'.$myrow['title'].'</a>

2) стало не 123456, а 12346

3) стало 12345 - последний существующий

4) стало 12347

добавление новой инфы (insert) - это добавление, а апдейт (update) - это замена

перезапись таблицы, это как ?

drop table

create table

На сколько я понимаю, запись добавляется в конец, так?

У тебя по другому написано, почему?

Вот так я добавляю новую инфу:

$result = mysql_query ("INSERT INTO articles (title,date,small_text,full_text,author) VALUES ('$title','$date','$small_text','$full_text','$author')");

Вот так я ее редактирую и обновляю соответственно:

$result = mysql_query ("UPDATE articles SET title='$title', date='$date', small_text='$small_text', full_text='$full_text', author='$author' WHERE id='$id'");

Link to comment
Share on other sites

  • 0

Судя по тому, как ты добавляешь запись, поле ID у тебя автоинкрементируемое, то есть туда автоматом подставляется следующий порядковый номер. Если так, то число в ID не зависит от количества явно используемых идентификаторов, туда всегда подставляется на едницу больший, чем тот, который был использован в последний раз.

В общем, если у тебя mysql, то обрати внимание на auto_increment.

Link to comment
Share on other sites

  • 0
Судя по тому, как ты добавляешь запись, поле ID у тебя автоинкрементируемое, то есть туда автоматом подставляется следующий порядковый номер. Если так, то число в ID не зависит от количества явно используемых идентификаторов, туда всегда подставляется на едницу больший, чем тот, который был использован в последний раз.

В общем, если у тебя mysql, то обрати внимание на auto_increment.

Да, id - автоинкремент.

То есть не использовать автоинкремент?

Edited by rus
Link to comment
Share on other sites

  • 0

mysql_num_rows -- Возвращает количество рядов результата запроса, т.е. сумму, кол-во рядов запроса, к автоикременту индекса неимеит никокого отношения.

На сколько я понимаю, запись добавляется в конец, так?

да, в конец, а кудаж ещё их добавлять ?

У тебя по другому написано, почему?

будем считать я исправил твои опечатки.

Вот так я добавляю новую инфу:

Вот так я ее редактирую и обновляю соответственно:

Всё правильно, тыж при инсерте не указываешь id, а в таблице он инкремент (+1), от последнего существовавшего

Да, id - автоинкремент.

То есть не использовать автоинкремент?

а вот это ты сам подумай, отключение автоинкремента не добавит ли тебе лишних проблем и ошибок ?

Link to comment
Share on other sites

  • 0
ребят, читаем документацию, http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html

Не алле страница.

Все работают используя автоинкремент, просто надо немного знаний про то, "как его готовить".

rus, ты вообще что пытаешься сделать?

Да так, эксперементирую... :)

mysql_num_rows -- Возвращает количество рядов результата запроса, т.е. сумму, кол-во рядов запроса, к автоикременту индекса неимеит никокого отношения.

да, в конец, а кудаж ещё их добавлять ?

будем считать я исправил твои опечатки.

Всё правильно, тыж при инсерте не указываешь id, а в таблице он инкремент (+1), от последнего существовавшего

а вот это ты сам подумай, отключение автоинкремента не добавит ли тебе лишних проблем и ошибок ?

То есть все таки нужна проверка на то какой id стоит в конце и к нему прибавлять один, так?

Link to comment
Share on other sites

  • 0
ребят, читаем документацию, http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html

Мудрёно написано, вобщем с таблицей я понял, но онже не целиком а по одной записи удаляет и хочет возвращать инкремент, такое возможно ? и желательно побольше конкретики :)

Link to comment
Share on other sites

  • 0

Ну допустим, ты хочешь вставить запись: ваще не заморачиваешься с id, как ты и делал раньше.

Хочешь список всех записей: ну тут тебе тоже id не нужен, не правда ли, ведь выбираем ВСЕ записи?

Хочешь число записей: есть такая групповая функция count() - выдаст количество того, что попало в выборку.

Хочешь найти конкретную запись: ну не по id же искать записи? Обычно их ищут по автору, по дате или по какой-то другой "неслужебной" инфе. Хотя можно и по id.

Хочешь удалить записть: вот тут может помочь id, если знаешь, что хочешь удалить запись с конкретным id.

Хочешь связать 2 таблицы, например посты в блоге и их авторы: тут тебя тоже спасёт id, будешь писать, что id из одной таблицы равно id из другой.

В общем, во всех перечисленных случаях тебя либо вообще не интересует поле id, либо тебе важно, что оно уникально, и совершенно наплевать, что именно туда записано и откуда оно там взялось.

Link to comment
Share on other sites

  • 0
Не алле страница.

Да так, эксперементирую... :)

То есть все таки нужна проверка на то какой id стоит в конце и к нему прибавлять один, так?

и такое возможно, но зачем ?

Link to comment
Share on other sites

  • 0
зачем вообще следить за AI полем? ну ребят, вы серьезно? вам эта циферка сдалась, ну чисто для того чтоб все ровненько?

Теперь вопрос века - кто это оценит кроме вас? вот и не парьтесь. на скорость работы не влияет

Link to comment
Share on other sites

  • 0

Иван, вобщем твое решение очень хорошее, но к сожалению я никак не могу взять в толк как мне связать две команды:

DELETE и TRUNCATE?

То есть по отдельности они работают, TRUNCATE затирает пустые строки, но удаляет сразу и все.

А как оставить возможность выбора?

То есть если хочу, могу удалить все записи, если не хочу - то только одну.

$result = mysql_query("DELETE FROM articles WHERE id='$id'");

Так работает, но остаются пустые строки.

$result = mysql_query("TRUNCATE articles");

Так удаляет все сразу и пустых строк нет.

$result = mysql_query("DELETE FROM articles WHERE id='$id', TRUNCATE articles");

Так не работает. :)

Link to comment
Share on other sites

  • 0
Иван, вобщем твое решение очень хорошее, но к сожалению я никак не могу взять в толк как мне связать две команды:

DELETE и TRUNCATE?

никак. забей на перестройку индексов - это плохо

Link to comment
Share on other sites

  • 0
никак. забей на перестройку индексов - это плохо

Неужели нет решения?

Даже ты не знаешь? Такого быть не может! :)

UPD: к тому же перестройка индексов это еще не вся проблема, оператор DELETE вроде как способен на удаление только по одной строке, а нужна возможность выбора, типа мультиселект, хочешь - одну строку, хочешь - все.

Я не прошу кода, просто нужно ключевое слово для поиска, вот и все. :)

Edited by rus
Link to comment
Share on other sites

  • 0

Хах, а я решил эту проблему, но... частично.

При этом задействовал оба оператора, но только вот проблема с пустыми строками почему-то осталась.

Сделал таким образом:

<?php
if (isset ($all_id))
{
$result = mysql_query("TRUNCATE articles");
}
if (isset ($id))
{
$result = mysql_query("DELETE FROM articles WHERE id='$id'");
if ($result == 'true')
{
echo "<p>Информация успешно удалена!</p>";
}
else
{
echo "<p>Информация не удалена!</p>";
}
}
else
{
echo "<p>Вы не выбрали ни одну статью для удаления!</p>";
}
?>

$all_id - приходит с мультичекбокса, а $id - с остальных чекбоксов.

Но вот строки почему-то не подчищаются до конца.

UPD: хаха, я тут по ходу сам с собою веду беседу :)

Вобщем с этой проблемой я тоже справился.

Осталось только сделать так, что бы можно было выборочно удалять записи. :)

Edited by rus
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy