Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] Triger na tej samej tabeli
Forum PHP.pl > Forum > Bazy danych
wlamywacz
Witam!

Tabela "categories":
  1. CREATE TABLE IF NOT EXISTS `categories` (
  2. `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `name` varchar(120) NOT NULL,
  4. PRIMARY KEY (`id`),
  5. UNIQUE KEY `id` (`id`)
  6. )

Tabela "relations":
  1. CREATE TABLE IF NOT EXISTS `relations` (
  2. `parent_id` int(11) NOT NULL,
  3. `child_id` int(11) NOT NULL,
  4. `depth` int(11) NOT NULL
  5. )

Triger:
  1. DELIMITER //
  2. CREATE TRIGGER `relation_insert` AFTER INSERT ON `relations`
  3. FOR EACH ROW BEGIN
  4.  
  5. IF NEW.depth != 0 THEN
  6. INSERT INTO relations (parent_id, child_id, depth) VALUES (NEW.child_id, NEW.child_id, 0);
  7. INSERT INTO relations (parent_id, child_id, depth)
  8. SELECT parent_id, NEW.child_id, depth + 1 FROM relations WHERE child_id = NEW.parent_id AND depth > 0;
  9. END IF;
  10.  
  11. END
  12. //
  13. DELIMITER ;

Po dodaniu kategorii, tworze do niej główny węzeł w tabeli relations. Triger w założeniu ma tworzyć pozostałe węzły jednak dostaje komunikat:
Cytat
#1442 - Can't update table 'relations' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

I zapytanie:
  1. INSERT INTO `categories` (`name`) VALUES ('test');
  2. INSERT INTO relations (`parent_id`, `child_id`, `depth`) VALUES (4, LAST_INSERT_ID(), 1);

Parent_id = 4, gdyż znajduje się już jeden rodzic pod którego chciałem ten element podpiąć.
woj_tas
1. Nie można robić inserta do tabli na ktorej wykonujesz trigera (czyli na samej sobie)
2. To drzewo kategorii? Nie łatwiej użyć Nested Tree - link - The Nested Set Model
wlamywacz
Nested set są złe z powodu braku możliwości sensowego ich posortowania. Ok, poradzę sobie stosując jedną nadmiarową kolumną do trigera. Pozdrawiam
matix
Według mnie najlepszym rozwiązaniem jest połączenie Nested Tree z drzewkiem IP.

Dodaj po prostu takie kolumny: cat_parent_id ( default = NULL) , cat_deph ( default np. 1 ) oraz cat_ip.
W tym momencie masz możliwość ich sortowania przez własnie pole cat_ip (po IP).

Pzdr.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.