Здесь показаны различия между двумя версиями данной страницы.
| Следующая версия | Предыдущая версия | ||
|
mysql:nested_set [2024/11/02 09:56] werwolf создано |
mysql:nested_set [2024/11/02 09:57] (текущий) werwolf |
||
|---|---|---|---|
| Строка 6: | Строка 6: | ||
| \\ Хорошая новость ребята! В //MySQL// нет проблемы с рекурсивными триггерами! Разработчики //MySQL// просто тупо лочат изменяемую таблицу даже на уровне триггера, вот редиски. Но, собственно, нас может остановить только отключение электричества.\\ Есть небольшая лазейка, с… объединенными таблицами. Хотя я не нашел в документации подтверждения того, что это так специально было задумано, но и отрицания тоже не было. Правда есть вероятность того, что эту лазейку могут прикрыть, хотя я не вижу в этом смысла.\\ Увы, механизм триггеров в //MySQL// новый и довольно сырой, что накладывает некоторые ограничения на его использование, но все же его достаточно для решения нашей задачи.\\ Итак, исходная таблица:\\ SQL код (1) | \\ Хорошая новость ребята! В //MySQL// нет проблемы с рекурсивными триггерами! Разработчики //MySQL// просто тупо лочат изменяемую таблицу даже на уровне триггера, вот редиски. Но, собственно, нас может остановить только отключение электричества.\\ Есть небольшая лазейка, с… объединенными таблицами. Хотя я не нашел в документации подтверждения того, что это так специально было задумано, но и отрицания тоже не было. Правда есть вероятность того, что эту лазейку могут прикрыть, хотя я не вижу в этом смысла.\\ Увы, механизм триггеров в //MySQL// новый и довольно сырой, что накладывает некоторые ограничения на его использование, но все же его достаточно для решения нашей задачи.\\ Итак, исходная таблица:\\ SQL код (1) | ||
| - | <code> | + | <code mysql> |
| CREATE TABLE `ns_tree` ( | CREATE TABLE `ns_tree` ( | ||
| `id` int(11) NOT NULL auto_increment, | `id` int(11) NOT NULL auto_increment, | ||
| Строка 21: | Строка 21: | ||
| \\ На основе нее делаем точно такую же таблицу, с точно таким же набором полей:\\ SQL код (2) | \\ На основе нее делаем точно такую же таблицу, с точно таким же набором полей:\\ SQL код (2) | ||
| - | <code> | + | <code mysql> |
| CREATE TABLE `_ns_tree` ( | CREATE TABLE `_ns_tree` ( | ||
| `id` int(11) NOT NULL auto_increment, | `id` int(11) NOT NULL auto_increment, | ||
| Строка 52: | Строка 52: | ||
| SQL код (3) | SQL код (3) | ||
| - | <code> | + | <code mysql> |
| CREATE DEFINER = 'user'@'localhost' TRIGGER `ns_tree_before_ins_tr` BEFORE INSERT ON `ns_tree` | CREATE DEFINER = 'user'@'localhost' TRIGGER `ns_tree_before_ins_tr` BEFORE INSERT ON `ns_tree` | ||
| FOR EACH ROW | FOR EACH ROW | ||
| Строка 111: | Строка 111: | ||
| \\ Принцип тот же с применением диалекта.\\ SQL код (4) | \\ Принцип тот же с применением диалекта.\\ SQL код (4) | ||
| - | <code> | + | <code mysql> |
| CREATE DEFINER = 'user'@'localhost' TRIGGER `ns_tree_before_upd_tr` BEFORE UPDATE ON `ns_tree` | CREATE DEFINER = 'user'@'localhost' TRIGGER `ns_tree_before_upd_tr` BEFORE UPDATE ON `ns_tree` | ||
| FOR EACH ROW | FOR EACH ROW | ||
| Строка 257: | Строка 257: | ||
| \\ Из-за отсутствия проблем с рекурсией триггеров, удаление вообще становится тривиальной задачей.\\ Триггер для варианта: «удаление ветки целиком»:\\ SQL код (5) | \\ Из-за отсутствия проблем с рекурсией триггеров, удаление вообще становится тривиальной задачей.\\ Триггер для варианта: «удаление ветки целиком»:\\ SQL код (5) | ||
| - | <code> | + | <code mysql> |
| CREATE DEFINER = 'user'@'localhost' TRIGGER `ns_tree_before_del_tr` AFTER DELETE ON `ns_tree` | CREATE DEFINER = 'user'@'localhost' TRIGGER `ns_tree_before_del_tr` AFTER DELETE ON `ns_tree` | ||
| FOR EACH ROW | FOR EACH ROW | ||
| Строка 283: | Строка 283: | ||
| \\ Триггер для варианта: «удаление узла со смещением дочерних узлов на уровень ввверх»:\\ SQL код (6) | \\ Триггер для варианта: «удаление узла со смещением дочерних узлов на уровень ввверх»:\\ SQL код (6) | ||
| - | <code> | + | <code mysql> |
| CREATE DEFINER = 'user'@'localhost' TRIGGER `ns_tree_before_del_tr` AFTER DELETE ON `ns_tree` | CREATE DEFINER = 'user'@'localhost' TRIGGER `ns_tree_before_del_tr` AFTER DELETE ON `ns_tree` | ||
| FOR EACH ROW | FOR EACH ROW | ||
| Строка 319: | Строка 319: | ||
| * Не уникальный на поле (//parent_id//); | * Не уникальный на поле (//parent_id//); | ||
| - | \\ Наслаждайтесь ;-)\\ //Сергей Томулевич aka Phoinix (08.07.2009 г.)// | ||
| - | Теги: | ||
| - | |||
| - | * [[:ru:search:?target_type=posts&order=relevance&q=[nested+sets]|nested sets]] | ||
| - | * [[:ru:search:?target_type=posts&order=relevance&q=[nested+set]|nested set]] | ||
| - | * [[:ru:search:?target_type=posts&order=relevance&q=[mysql]|mysql]] | ||
| - | * [[:ru:search:?target_type=posts&order=relevance&q=[%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D1%8C%D1%8F+%D0%B1%D0%B4]|деревья бд]] | ||
| - | * [[:ru:search:?target_type=posts&order=relevance&q=[%D1%82%D1%80%D0%B8%D0%B3%D0%B3%D0%B5%D1%80%D1%8B]|триггеры]] | ||
| - | |||
| - | Хабы: | ||
| - | |||
| - | * [[:ru:hubs:mysql:|MySQL]] | ||