2009-06-13 5 views
9

J'ai la structure DB suivante dans SQLite:Déclencheurs Cascade dans SQLite

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

Je veux créer un déclencheur que chaque fois que je supprime un pays tous les districts connexes, les municipalités et les paroisses sont également supprimées (comme MySQL InnoDB), je l'ai essayé d'utiliser les déclencheurs SQLite et est venu avec ceci:

Quartiers:

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

Municipalités:

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

Paroisses:

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

Je ne l'ai pas encore testé le delete_district et delete_municipality déclenche parce que je reçois un comportement étrange sur la gâchette delete_country: lorsque je supprime une pays seul le premier district correspondant est supprimé, tous les autres districts liés restent dans le tableau. Qu'est-ce que je fais mal?

+4

Qu'avez-vous utilisé pour créer les graphiques ? – Nifle

+0

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

Répondre

13

Le déclencheur ressemble il est districts dont l'ID est supprimait id_countries, qui est, la clause where est en fait

WHERE districts.id_countries = districts.id 

Vous devez faire référence à l'identifiant de la table des pays. Dans un déclencheur de suppression, utilisez "old" pour le faire.

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

Aussi, je suggère de changer votre convention de nommage de schéma. Généralement, le nom de la table est singulier et correspond à l'entité dans une ligne. J'aurais une table de pays avec des colonnes id et le nom, une table de district id, country_id et le nom, etc.

country 
------- 
id 
name 

district 
------- 
id 
country_id 
name 

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

parish 
----- 
id 
municipality_id 
name 

Ensuite, le déclencheur serait

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

Merci beaucoup pour votre aide, la vieille chose a très bien fonctionné. =) –