Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [mysql] Triger na tej samej tabeli
wlamywacz
post
Post #1





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


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ąć.

Ten post edytował wlamywacz 28.04.2010, 14:55:58
Go to the top of the page
+Quote Post
woj_tas
post
Post #2





Grupa: Zarejestrowani
Postów: 230
Pomógł: 36
Dołączył: 31.03.2006
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


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

Ten post edytował woj_tas 28.04.2010, 19:12:49
Go to the top of the page
+Quote Post
wlamywacz
post
Post #3





Grupa: Zarejestrowani
Postów: 535
Pomógł: 27
Dołączył: 3.05.2005

Ostrzeżenie: (20%)
X----


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
Go to the top of the page
+Quote Post
matix
post
Post #4





Grupa: Zarejestrowani
Postów: 278
Pomógł: 10
Dołączył: 13.02.2007
Skąd: Rybnik

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.12.2025 - 15:13