2009-06-13 10 views
9

मैंने SQLite में निम्नलिखित डीबी संरचना में:कास्केड ट्रिगर SQLite

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

मैं एक ट्रिगर है कि जब भी मैं एक देश को नष्ट सभी संबंधित जिलों, नगर पालिकाओं और पारिशों भी नष्ट हो जाती हैं बनाना चाहते हैं (MySQL InnoDB) की तरह, मैं SQLite चलाता उपयोग करने की कोशिश करते हैं और इस के साथ आया है:

जिलों:

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

नगर पालिकाओं:

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

पारिशों:

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

मैं अभी तक परीक्षण नहीं किया delete_district और delete_municipality से चलाता है, क्योंकि मैं delete_country ट्रिगर पर एक अजीब व्यवहार मिलता है: जब मैं एक हटाना देश केवल पहला संबंधित जिला हटा दिया गया है, अन्य सभी संबंधित जिलों तालिका में रहते हैं। मैं क्या गलत कर रहा हूं?

+4

क्या आप ग्राफिक्स बनाने के लिए उपयोग किया होगा कॉलम आईडी और नाम, आईडी, country_id और नाम के साथ एक जिले मेज, आदि के साथ एक देश तालिका होता ? – Nifle

+0

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

उत्तर

13

ट्रिगर लगता है कि यह जिलों जिसका आईडी id_countries के बराबर होती है हटा रहा है, वह है, जहां खंड वास्तव में

WHERE districts.id_countries = districts.id 

आप उन देशों को मेज से आईडी को संदर्भित करने की जरूरत है। एक हटाने ट्रिगर में, ऐसा करने के लिए "पुराना" का उपयोग करें।

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

इसके अलावा, मैं आपके स्कीमा नामकरण सम्मेलन को बदलने का सुझाव दूंगा। आमतौर पर, तालिका का नाम एकवचन होता है, और एक पंक्ति में इकाई से मेल खाता है। मैं

country 
------- 
id 
name 

district 
------- 
id 
country_id 
name 

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

parish 
----- 
id 
municipality_id 
name 

फिर ट्रिगर

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

आपकी मदद के लिए बहुत बहुत धन्यवाद, पुरानी बात सिर्फ महान काम करती है। =) –