2009-06-13 16 views
9

Sono la seguente struttura DB SQLite:Cascade Trigger in SQLite

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

Voglio creare un trigger che ogni volta che si elimina un paese tutti i distretti relativi, i comuni e le parrocchie vengono eliminati anche (come MySQL InnoDB), ho provato con i trigger SQLite e arrivato fino a questo:

distretti:

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

Comuni:

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

parrocchie:

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

non ho ancora testato il delete_district e delete_municipality innesca perché ho uno strano comportamento sul delete_country grilletto: quando elimino un paese solo il primo distretto correlato viene cancellato, tutti gli altri distretti correlati rimangono nel tavolo. Che cosa sto facendo di sbagliato?

+4

Cosa hai usato per creare la grafica ? – Nifle

+0

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

risposta

13

L'innesco sembra che sta cancellando i distretti il ​​cui id uguale id_countries, cioè, in cui la clausola è in realtà

WHERE districts.id_countries = districts.id 

È necessario fare riferimento l'id dalla tabella paesi. In un trigger di eliminazione, usa "vecchio" per farlo.

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

Inoltre, suggerirei di modificare la convenzione di denominazione dello schema. Di solito, il nome della tabella è singolare e corrisponde all'entità in una riga. Avrei una tabella di campagna con le colonne id e il nome, un tavolo quartiere con id, country_id e il nome, ecc

country 
------- 
id 
name 

district 
------- 
id 
country_id 
name 

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

parish 
----- 
id 
municipality_id 
name 

Poi il grilletto sarebbe

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

Grazie mille per il vostro aiuto, la vecchia cosa ha funzionato alla grande. =) –