Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
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 | ||