2009-06-13 18 views
9

Mam następującą strukturę DB w SQLite:Cascade wyzwalaczy w SQLite

db structure http://i39.tinypic.com/kb3qef.jpg

Chcę utworzyć wyzwalacz, że gdy usunę kraju wszystkie związane z nimi powiaty, gminy i parafie są również usuwane (jak MySQL InnoDB), próbowałem przy użyciu SQLite wyzwalaczy i podszedł z tym:

Dzielnice:

CREATE TRIGGER [delete_country] 
BEFORE DELETE 
ON [countries] 
FOR EACH ROW 
BEGIN 
DELETE FROM districts WHERE districts.id_countries = id; 
END 

gmin:

CREATE TRIGGER [delete_district] 
BEFORE DELETE 
ON [districts] 
FOR EACH ROW 
BEGIN 
DELETE FROM municipalities WHERE municipalities.id_districts = id; 
END 

Parafie:

CREATE TRIGGER [delete_municipality] 
BEFORE DELETE 
ON [municipalities] 
FOR EACH ROW 
BEGIN 
DELETE FROM parishes WHERE parishes.id_municipalities = id; 
END 

Jeszcze nie testowałem delete_district i delete_municipality wyzwala ponieważ otrzymuję dziwne zachowanie na delete_country spustu: Kiedy usunąć kraj tylko pierwsza powiĘ ... zana powiat zostanie skasowana, pozostałe powiĘ ... zane powiaty pozostajĘ ... w tabeli. Co ja robię źle?

+4

Czego używać do tworzenia grafiki ? – Nifle

+0

http://ondras.zarovi.cz/sql/ –

Odpowiedz

13

Spust wygląda ona usuwanie dzielnice, których id równa id_countries, to znaczy, gdy klauzula jest rzeczywiście

WHERE districts.id_countries = districts.id 

Trzeba odwołać id z tabeli krajów. W wyzwalaczu usuwania użyj "old", aby to zrobić.

CREATE TRIGGER [delete_country] 
BEFORE DELETE 
ON [countries] 
FOR EACH ROW 
BEGIN 
DELETE FROM districts WHERE districts.id_countries = old.id; 
END 

Również chciałbym zaproponować zmianę schematu nazewnictwo. Zwykle nazwa tabeli jest pojedyncza i odpowiada jednostce z rzędu. Musiałbym kraj tabeli z kolumnami ID i nazwę, stół dzielnica z id, country_id i nazwy itp

country 
------- 
id 
name 

district 
------- 
id 
country_id 
name 

municipality 
------------ 
id 
district_id 
name 

parish 
----- 
id 
municipality_id 
name 

Wtedy wyzwalacz byłyby

CREATE TRIGGER [delete_country] 
BEFORE DELETE 
ON [country] 
FOR EACH ROW 
BEGIN 
DELETE FROM district WHERE district.country_id = old.id; 
END 
+1

Bardzo dziękuję za pomoc, stare urządzenie działało świetnie. =) –