всем привет.
Есть две таблицы
первая книги
book
id | book_name
и таблица связи книги и стола
link_book_tools
book_id | table_id
таблица бук содержит записи о книгах, книги раскиданы по "инструментам" многие ко многим.
И вот в чем суть как реализовать на уровне mysql грамотную очистку. Т.е. когда мы удаляем все записи из таблицы "связей" (link_book_tools) т.е. удаляем все связи определенной книги и инструментов, нужно что бы строка с id книги удалялась и из таблицы book
на уровне связи mysql это сделать не получилось, т.к.нет условия учитывающего полное удаление конкретного айдишника из таблицы link_book_tools, можно ли подобное организовать на уровне тригеров?
Т.е. тригер должен сработать после удаления, получить id книги, проверить есть ли связи с данным айдшником и если нет удалить строчку из таблицы book это возможно?
Цитата (hurt3 @ 3.04.2016 - 17:09) |
на уровне связи mysql это сделать не получилось, т.к.нет условия учитывающего полное удаление конкретного айдишника из таблицы link_book_tools |
What? Это как? При удалении, есть опция CASCADE, которая сама подчистит все связи с записью. Все замечательно работает.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
T1grOK
смотрите она хороша в том случае если нужно, удалить последовательность книга -> все линки(конкретной книги) с инструментами
но если мы удаляем все линки(конкретной книги) , мы должны удалить книгу - это не сделать с помошью связей mysql. т.к. при удалении 1 линка удаляется и очищается и таблица книг, а затем ощищаються все связанные с ней линки
Цитата (hurt3 @ 3.04.2016 - 17:50) |
т.к. при удалении 1 линка удаляется и очищается и таблица книг, а затем ощищаються все связанные с ней линки |
Ничего подобного. Т-к основная сущность находится в другой таблице.
Цитата (hurt3 @ 3.04.2016 - 17:50) |
но если мы удаляем все линки(конкретной книги) , мы должны удалить книгу |
Тогда триггером(BEFORE DELETE) или на стороне своего приложения.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api

вот картинка отражает структуру, когда мы удлаяем все красные блоки из второй таблицы, родительский красный блок должен удалится и из первой, но лишь когда все дочерние удалены из второй!
Цитата (T1grOK @ 3.04.2016 - 18:04) |
Тогда триггером(BEFORE DELETE) или на стороне своего приложения.
|
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
T1grOK
не получается его написать в phpmyadmin)))), можете ссылку на мануал нормальный скинуть, не понимаю как указывать переменную id которая отправляется приложением к бд
и phpmyadmin ругается на if end и т.п.
Хм..сразу первая ссылка в поисковой выдаче
http://www.techonthenet.com/mysql/triggers/before_delete.phpOLD содержит данные удаляемой строки.
Проверяем доп запросом количество строк удовлетворяющее условию и принимаем решение.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
а можно как то получить данные которые идут в запросе, после чего срабатывает тригер?
и еще вопрос допустим система будет постоянно добавлять и удалять линки не слишком большая нагрузка ляжет на систему с постоянной проверкой по триггеру?
Цитата (hurt3 @ 3.04.2016 - 18:17) |
а можно как то получить данные которые идут в запросе, после чего срабатывает тригер?
|
Все действия выполняются в тригере, на то он и триггер чтобы срабатывать по основным операциям CRUD.
Если в рассматриваемой системе операции удаления преобладают, перед операциями выборки и очень критична максимальная производительность, то использование задачи(скрипта), которая будет периодически подчищать данные в таблицах дадут меньший оверхед.
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
T1grOK
понял спасибо большое
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.