ďťż
 
drzewa faq metoda 5 - usuwanie ďťż
 
drzewa faq metoda 5 - usuwanie
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • atanvarne633.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com