Удаление записей из связанных таблиц

_RVK_

Новичок
Удаление записей из связанных таблиц

Всю жизнь удалял какадно. Начинал с верхней и так доходил до самой нижней. Но что то мне этот способ кажется не больно эфективным. Как оптимизровать этот процесс?
 

HEm

Сетевой бобер
для баз, поддерживающих триггеры - триггеры
 

Макс

Старожил PHPClub
в нормальных СУБД обычно есть
REFERENCES tab_name (index_name) ON DELETE CASCADE

который по внешним ссылкам каскадно все удаляет
 

_RVK_

Новичок
Я имею ввиду обычный MyISAM. Насколько знаю эти таблицы не поддерживают тригеры и связывание таблиц. Я хочу узнать нужели все, для такой тривиальной задачи выполняют такую массу селектов и делов. Может есть красивый и удобный способ. Поделитесь опытом.
 

Макс

Старожил PHPClub
Diesel
Если ты задаешь вопрос чисто по mysql, то зачем его размещать в форуме "PHP и базы данных " если есть специализированный форум по MySQL ???
Перенести ?

PS
задача тривиальная, а вот ограничения у MyISAM нестандартные, поэтому и прийдется выполнять "массу селектов"
 

_RVK_

Новичок
Maxim Matyukhin я его вообще в разделе PHP разместил (перенесли), потому что интересуют решения не только средствами СУБД, но и средствами пхп. Настало время решать задачу, хочу сделать это максимально красиво. Типа написать функцию, которая будет максимально универсальна. Не могу поверить что гуру, каждый раз пишут один и тот же, по сути код...

ЗЫ. Я не прошу готовый код, я прошу идею. Типа: "Я написал функцию, которой передаю такие-то параметры, а она..." или "я пользую класс из PEAR который эту задачу решает так..." или "Вот хитрый SQL запрос, который удаляет данные из всех таблиц....", или что то в этом роде
 

Макс

Старожил PHPClub
Diesel
Извини, не знал что тема уже была перенесена.
Даже если ты разместил его в разделе по ПХП, надо было бы указать, что работаешь с MyISAM.


Не могу поверить что гуру, каждый раз пишут один и тот же, по сути код...
Сколько уровней связей тебя интересуют ?
У меня практически всегда только 2 уровня (Например Автор и Статьи автора) встречаются. И там никаких селектов не надо. Просто 2 DELETE-запроса.

Если предположить что статья имеет коментарии которіе нужно удалить, то мне работу упрощает ADODB:
PHP:
$user_to_delete = 123;
$conn->execute('DELETE FROM my_users WHERE user_id = '.$user_to_delete);
// получаем список статей
$articles = $conn->getCol('SELECT article_id FROM my_articles WHERE user_id = '.$user_to_delete);
// удаляем комментарии
$sql_addon = implode(",", $articles);
$conn->execute('DELETE FROM my_comments WHERE article_id IN ('.$asql_addon.')');
$conn->execute('DELETE FROM my_articles WHERE user_id = '.$user_to_delete);
5 строк кода на 3 удаления, как для меня, не много

Ничего универсального не писал (и не задумывался об этом).
В пхп5 думаю переходить на propel (propel.phpdb.org). Я не знаю, реализована ли там сейчас фича каскадного удаления, но там ее можно будет реализовать, так как связи между таблицами описаны в XML-файлах

-~{}~ 08.07.04 13:50:

кстати mysql4 поддерживает многотабличные удаления
http://dev.mysql.com/doc/mysql/ru/DELETE.html
 

_RVK_

Новичок
Maxim Matyukhin спасибо! Вообще, когда задался этим вопросом, первой мыслью был запрос, удаляющий записи из нескольких таблиц. Был удивлен, что MySQL не поддерживает такой нужной возможности.
5 строчек это не много, но когда делаешь это уже в 1361 раз начинаешь задумываться. Хотя может я слишком стремлюсь к универсализации. Ну не люблю я одну и ту же работу по многу раз делать....
 
Сверху