drzewa faq metoda 5 - usuwanie
tomo - 19-11-2005 23:24
drzewa faq metoda 5 - usuwanie
witam!
postgres 7.3
żeby usunąć gałąź drzewa, używam zapytania:
DELETE FROM powiazania WHERE parent_id IN (SELECT r2.parent_id FROM powiazania r1 JOIN powiazania ON r1.child_id = r2.child_id WHERE r1.parent_id = X AND r2.depth > r1.depth) AND child_id IN (SELECT r2.child_id FROM powiazania r1 JOIN forum_connects r2 ON r1.child_id = r2.child_id WHERE r1.parent_id = X AND r2.depth > r1.depth);
X - identyfikator gałęzi drzewa do usunięcia
usunie mi ładnie wszystkie powiązania o które mi chodzi, ale w tabeli kategorie pozostają sieroty.
pewno trzeba ustawić gdzieś jakieś sprytne cascade ale nie wiem dokładnie jak
jak usunąć teraz te sieroty? jak powinno wyglądać zapytanie?
DELETE FROM kategorie ... NOT IN(SELECT ... LEFT JOIN
to nie jest chyba dobry pomysł, zważywszy, że podzapytanie może zwrócić nieskończoną liczbę rekordów (bo takie jest założenie, że drzewko może się zagłębiać w nieskończoność)
jeszcze jedno pytanie, jaki jest plus z dodania pola id w tabeli powiazania? zapytania prostsze w zapisie, zysk na szybkości też? minus taki, że dodatkowe pole zajmuje dodatkowe miejsce w bazie a przy dużej ilości elementów drzewa, to zwiększa rozmiar bazy
z góry dzięki za pomoc pozdrawiam
p.s struktura tabel:
create table kategorie ( id serial, name text, primary key (id) ); create table powiazania ( first_id int8, second_id int8, depth int8, primary key (first_id, second_id) ); alter table powiazania add foreign key (first_id) references kategorie (id); alter table powiazania add foreign key (second_id) references kategorie (id);
Paweł Matejski - 19-11-2005 23:24
tomo wrote: > witam! > > postgres 7.3 > > żeby usunąć gałąź drzewa, używam zapytania: > > DELETE FROM powiazania WHERE parent_id IN (SELECT r2.parent_id FROM > powiazania r1 JOIN powiazania ON r1.child_id = r2.child_id WHERE > r1.parent_id = X AND r2.depth > r1.depth) AND child_id IN > (SELECT r2.child_id FROM powiazania r1 JOIN forum_connects r2 ON r1.child_id > = > r2.child_id WHERE r1.parent_id = X AND r2.depth > r1.depth); > > X - identyfikator gałęzi drzewa do usunięcia > > usunie mi ładnie wszystkie powiązania o które mi chodzi, > ale w tabeli kategorie pozostają sieroty. > > pewno trzeba ustawić gdzieś jakieś sprytne cascade > ale nie wiem dokładnie jak > > jak usunąć teraz te sieroty?
Lepiej chyba od razu wszystko usuwać:
DELETE FROM powiazania WHERE child_id IN ( SELECT DISTINCT child_id FROM powiazania WHERE parent_id = X )
Zadziała tylko jeśli stosujesz powiązanie o depth = 0.
> jeszcze jedno pytanie, > jaki jest plus z dodania pola id w tabeli powiazania? > zapytania prostsze w zapisie, > zysk na szybkości też? > minus taki, że dodatkowe pole zajmuje dodatkowe miejsce w bazie > a przy dużej ilości elementów drzewa, > to zwiększa rozmiar bazy
Ja mam regułe - każda tabele ma pole id. Żeby ją pominąć musiałbym policzyć, że mi faktycznie braknie miejsca.
> p.s > struktura tabel: > > create table kategorie ( > id serial, > name text, > primary key (id) > ); > create table powiazania ( > first_id int8, > second_id int8, > depth int8, > primary key (first_id, second_id) > );
Struktura Ci się troche z zapytaniem nie zgadza. ;) Będe stosował jednak takie nazwy kolumn jakie użyłeś w zapytaniu (parent_id i child_id)
> alter table powiazania add foreign key (first_id) references kategorie (id); > alter table powiazania add foreign key (second_id) references kategorie > (id);
A jak stosujesz FK, to jednym zapytaniem można usunąć kategorie i powiązania z żadanej gałęzi o ile zdefiniujesz cascadowe kasowanie:
alter table powiazania add foreign key (parent_id) references kategorie (id) on delete cascade; alter table powiazania add foreign key (child_id) references kategorie (id) on delete cascade;
DELETE FROM kategorie WHERE id IN ( SELECT DISTINCT child_id FROM powiazania WHERE parent_id = X )
-- P.M.
tomo - 19-11-2005 23:24
> DELETE FROM kategorie > WHERE id IN ( SELECT DISTINCT child_id FROM powiazania WHERE parent_id = > X ) >
dzięki wielkie, o to mi chodziło ;)
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
mysql / drzewa / produkty jak to =?ISO-8859-2?Q?zrobi=E6_jedny?==?ISO-8859-2?Q?m_zapytaniem=3F?=
[Oracle] Jakim poleceniem usuwa sie ca?? scheme bez usuwania usera?
=?iso-8859-2?Q?MYSQL_-_szybkie_usuwanie_rekord=F3w_z_tabeli?=
[pl/sql] usuwanie znaku nowej lini ze stringa
[MS SQL]Usuwanie kolumny zawierajacej DEFAULT
[pl/sq] usuwanie 3 znaku od konca w stringu
=?iso-8859-2?q?jpg_-_usuwanie_artefakt=F3w_-_programik?=
SQL Server: jak zabronić usuwania rekordów?
usuwanie zduplikowanych =?ISO-8859-2?Q?tekst=F3w?=
FireBird + usuwanie dużej ilości rekordów
zanotowane.pldoc.pisz.plpdf.pisz.platanvarne633.opx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|