Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: kasowanie powiązanego wiersza
Forum PHP.pl > Forum > Bazy danych > PostgreSQL
php programmer
Witam, mam taki problem,

otóż jest tabela,z której chcę skasować w PgAdminie (nie mylić z phpPgAdminem),
pewną ilość wierwszy, jednak nie mogętego zrobić, ponieważ te id tych wierszy,
stanowi klucz obcy (referencję), w innej tabeli.

Tak więc moj problem polega na napisaniu triggera
i prawdopodobnie powiązanej do niego procedury

Czyli coś takiego:
  1. CREATE TRIGGER tr_delete_cascade
  2. BEFORE DELETE ON tabela_gdzie_kasuje
  3. i tutaj już pseudokod
  4. SKASUJ NAJPIERW WIERSZ
  5. z tej innej tabeli, która zawiera klucz obcy odnoszący się do
  6. tabela_gdzie_kasuje


to będzie mójpierwszy TRIGGER więc proszę o wyrozumiałośc
dr_bonzo
  1. .... order_id integer REFERENCES orders ON DELETE CASCADE,


Zdefiniuj tabele w ten sposob i powiazane wiersze same sie pokasuja.
php programmer
ale to chyba nie tak,
może się mylę, ale kasowanie kaskadowe
powoduje chyba kasowanie w dół,
a w moim przypadku cchodzi o kasowanie w górę
dr_bonzo
Zgadza sie, ale zobacz co napisales:

Cytat
otóż jest tabela,z której chcę skasować w PgAdminie [...], pewną ilość wierwszy, jednak nie mogę tego zrobić, ponieważ te id tych wierszy, stanowi klucz obcy [...] w innej tabeli.


Czyli chodzi ci o kasowanie "w dol", czyli usunac rodzica i dzieci ktore sie do niego odwoluja (rodzic_id to bedzie FK).

Bo w drugastrone to nie mialbys problemow z usuwaniem -- pozwoliloby ci usunac te wiersze.
php programmer
Acha OK, jednak mimo wszystko wolał bym użyć TRIGGERA,
ponieważ wolałbym uniknąc zmiany samej deklaracji tabeli,
SongoQ
No to cos w tym stylu, pomijam juz definicje triggera tylko pisze jego cialo

  1. DELETE FROM tabela_rodzica WHERE id = OLD.id jako klucz obcy do tabeli;


Takie rozwiaznie ma wielki minus tabela rodzica nie moze miec dzieci, bo wtedy bedziesz mial blad. Mozesz ewentualnie przed delete dac selecta ktory zwroci czy ma dzieci i wtedy wyrzucic blad lub zwrocic blad z usuniecia. Ale tak czy inaczej w ten sposob sie da zrobic.
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.