2009-06-13 173 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