2009-06-13 135 views
9

我有以下DB結構的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_districtdelete_municipality觸發,因爲我上delete_country觸發一個奇怪的現象:當我刪除國家只有第一個相關區被刪除,所有其他相關區都留在表中。我究竟做錯了什麼?

+4

那你用它來創建圖形? – Nifle 2009-06-13 08:37:10

+0

http://ondras.zarovi.cz/sql/ – 2009-06-13 08:49:50

回答

13

觸發看起來是刪除其地區ID等於id_countries,也就是在where子句實際上是

WHERE districts.id_countries = districts.id 

您需要從國家表引用的ID。在刪除觸發器中,使用「old」來執行此操作。

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

此外,我會建議更改您的架構命名約定。通常,表名是單數的,並且對應於一行中的實體。我將同列編號和名稱,用ID,COUNTRY_ID和名稱的分區表等國表

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