Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Обновление id, не имеющих auto increment
Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2014
Помог: 0 раз(а)
Здравствуйте.
Есть таблица с записями, у каждого - свой id. Если у этих id стоит A_I, то возникает такая проблема: если удалить, скажем, 5 запись из 10, то 5 записи уже не будет никогда (при создании новой записи следующий id будет 11). Для порядка, имхо, неплохо бы не использовать A_I и написать скрипт, отслеживающий и обновляющий id.
Алгоритм я себе представляю примерно таким (псевдокод):
Тут могут быть неточности с точки зрения php, не обращайте внимания - я код не продумывал, просто привожу для описания общей сути.
Новая запись имеет id на 1 больше, чем последний id в таблице. Всё хорошо. Но вот с удалением...
2. Удаление записи
В форме удаления выбираем запись, то есть id (это переменная $id);
DELETE FROM таблица WHERE id=$id;
Если удалена запись номер 5, то следом за 4 будет 6. Чтобы этого не было,
В цикле проделываем
$new_id = $id++;
UPDATE таблица SET id=$id WHERE id=$new_id;
До тех пор, пока в таблице есть ещё записи
Образовавшийся пропуск в ряде величин заполняется путём уменьшения всех id, стоящих после того, который мы удалили.
СУТЬ ВОПРОСА.
Если в таблице 10 или 20 записей - ещё ничего, но что если в блоге за несколько лет накопилась 1000 записей? Тогда, при попытке удалить 5-ю запись, запрос UPDATE будет посылаться 994 раза! Как сервер воспримет такую нагрузку?
В общем, коряво как-то выходит. Хочу спросить - есть ли какое-то более аккуратное решение?
P.S. Я слышал, что в sql-сервере предусмотрены какие-то процедуры, циклы... Может быть, не париться о php-шном "обновляторе", а сразу MySQL учить и в этом направлении курс держать?
difight
Отправлено: 08 Сентября, 2014 - 16:16:15
Посетитель
Покинул форум
Сообщений всего: 355
Дата рег-ции: Нояб. 2011
Помог: 3 раз(а)
Цитата:
Если в таблице 10 или 20 записей - ещё ничего, но что если в блоге за несколько лет накопилась 1000 записей? Тогда, при попытке удалить 5-ю запись, запрос UPDATE будет посылаться 994 раза! Как сервер воспримет такую нагрузку?
запрос UPDATE будет посылаться 994 раза!
С фигали ?
Мелкий
Отправлено: 08 Сентября, 2014 - 16:18:13
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Vechnost пишет:
то возникает такая проблема:
Проблема-то где?
----- PostgreSQL DBA
Vechnost
Отправлено: 08 Сентября, 2014 - 16:35:26
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2014
Помог: 0 раз(а)
А что, проблемы нету?!!
Ну, то есть да - то, что чём я говорю вначале, это скорее не проблема, а нюанс. Просто мне кажется, что id необходимо отслеживать без auto increment. Не логично как-то, когда удалишь с сайта старые записи, а потом отсчёт начинается с какой-нибудь там 369-й записи... Ведь именно так будет с ai.
Мой алгоритм предполагает уменьшение всех id, стоящих после удалённого. Если записей действительно много - мне кажется, нагрузка будет большая.
Ну подумайте: берётся id, который мы удалили. Следом за ним - id большего размера, и мы его уменьшаем. Следом следом - ещё id, и его уменьшаем... Чтобы выстроить ровную цепочку: 1,2,3,4,5,6,7,8 вместо разорванной 1,2,3,4,6,7,8. Ели записей 8 или 10, то цикл будет посылать 8 или 10 запросов на переписывание следующих id. Если записей (этих самых id) ОЧЕНЬ много (сайт разросся на годы), то и запросов будет столько же, сколько стоит записей после удалённой нами. И если их 1000, то, удалив 995-ю запись, мы получим всего 5 запросов, НО если мы удалим 5-ю или 1-ю запись - посчитайте сами, сколько будет запросов.
А если стану удалять запись в тот момент, когда на сайте несколько сотен (или тысяч) посетителей??? (ну, хороший сайт, раскрученный)
Неужели для современных серверов это настолько незначительно?
Или вы хотите сказать, что вообще не стоит заниматься этим? Либо с AI, либо никак?
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Vechnost пишет:
А что, проблемы нету?!!
Нету, конечно.
AI уникален.
Видите вот этот форум? Вы можете послать кому-нибудь на эту страницу ссылку? А если я сейчас удалю, например, тему №15140? Куда человек по вашей ссылке попадёт?
----- PostgreSQL DBA
Vechnost
Отправлено: 08 Сентября, 2014 - 20:40:47
Новичок
Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2014
Помог: 0 раз(а)
Конечно, AI уникален - кто ж спорит. Вероятно, этим вы хотите сказать, что отказываться от AI не имеет смысла, не так ли?
То есть, идея самому контролировать заполнение id - изначально тухлая затея?
Мелкий
Отправлено: 08 Сентября, 2014 - 21:12:37
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Vechnost пишет:
То есть, идея самому контролировать заполнение id - изначально тухлая затея?
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.