Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: drzewa sql metoda depesza
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
AcidBurnt
witam
w swoim systemie zaimplementowałem http://depesz.com/various-sqltrees-implementation.php dla drzewek

probuje wlasnie napisac f-cje do usuwania i zmiany rodzica na drzewku

i cos nie zabardzo mi wychodzi, tzn usuwanie ma polegac na tym ze zanim
uzytkownik zostanie usuniety z bazy i z drzewa to musi nastapic zmiana
rodzica dla jego dzieci na wybrenego rodzica przez uzytkownika, co za
tym idze cale drzewo podpiete pod niego ma zostac przepiete do nowego
uzytkownika, baza to PostgreSQL 7.4.6

baza wyglada tak:

  1. CREATE TABLE t_connections
  2. (
  3. parent_id int8,
  4. child_id int8,
  5. depth int8,
  6. CONSTRAINT t_connections_user_child_fkey FOREIGN KEY (child_id)
  7. REFERENCES t_users (user_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION,
  8. CONSTRAINT t_connections_user_id_fkey FOREIGN KEY (parent_id)
  9. REFERENCES t_users (user_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION
  10. )
  11.  
  12. CREATE TABLE t_users
  13. (
  14. user_id int8 NOT NULL DEFAULT
  15. NEXTVAL('t_users_user_id_seq'::regclass),
  16. user_parent int8,
  17. user_name char(60),
  18. CONSTRAINT t_users_pkey PRIMARY KEY (user_id),
  19. CONSTRAINT t_users_user_id_key UNIQUE (user_id)
  20. )
  21. WITHOUT OIDS;
  22.  
  23. CREATE TRIGGER add_connections
  24. AFTER INSERT ON t_users
  25. FOR EACH ROW
  26. EXECUTE PROCEDURE add_connections();
  27.  
  28. CREATE OR REPLACE FUNCTION add_connections()
  29. RETURNS "trigger" AS $BODY$DECLARE
  30. BEGIN INSERT
  31. INTO t_connections (parent_id, child_id, depth) VALUES
  32. (currval('t_users_user_id_seq'),currval('t_users_user_id_seq'),0);
  33. IF NEW.user_parent <> currval('t_users_user_id_seq') THEN
  34. INSERT
  35. INTO t_connections (parent_id, child_id, depth) VALUES
  36. (NEW.user_parent, currval('t_users_user_id_seq'), 1);
  37. END IF;
  38. INSERT
  39. INTO t_connections (parent_id, child_id, depth)
  40. SELECT parent_id, currval('t_users_user_id_seq'), depth + 1
  41. FROM t_connections WHERE child_id = NEW.user_parent AND depth > 0;
  42. RETURN NEW;
  43. END;
  44. $BODY$
  45. LANGUAGE 'plpgsql' VOLATILE;
  46. ALTER FUNCTION add_connections() OWNER TO postgres;


z góry dziekuje za pomoc
DeyV
Przypadkowo trafiłem na ten temat.
Ale co tam - jabol napisał kiedyś ciekawą funkcję do przenoszenia gałęzi:
http://forum.php.pl/index.php?showtopic=4037&hl=drzewka
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.