我正在研究一个支持SQLite的C ++应用程序,并使用基本的C API来访问SQLite数据库。我有两个表RIV_PATHS和RIV_INTERSECTIONS,其中RIV_PATHS包含一个主键,而Intersection包含多个外键,引用表RIV_PATHS(一个路径由多个交叉点组成)。每当删除路径时,都应删除所有交叉行。每当删除所有交叉点时,应删除路径:
CREATE TRIGGER PATHS_DELETE
AFTER DELETE ON RIV_PATHS
FOR EACH ROW
BEGIN
DELETE FROM RIV_INTERSECTIONS WHERE pid = OLD.id;
END;
CREATE TRIGGER ISECTS_DELETE
AFTER DELETE ON RIV_INTERSECTIONS
FOR EACH ROW
WHEN ((select count() from RIV_INTERSECTIONS where pid = OLD.pid) = 0)
BEGIN
DELETE FROM RIV_PATHS WHERE id = OLD.pid ;
END;
这很慢,我认为这是因为某些循环触发,但我不确定如何避免这种行为(如果可能的话)。我已经尝试将其中一个触发器改为之前但没有成功。
我对这些表的插入触发器也有同样的问题(未显示)。
数据库模式是这样的:我使用的两个RIV_ *表作为一些视图(但不是视图,因为我不能在SQLite中插入/更新它们)的其他一些表。我用SELECT * FROM
创建它们。
CREATE TABLE RIV_INTERSECTIONS(
PID INT,
BOUNCE_NR INT,
POS_X REAL,
POS_Y REAL,
POS_Z REAL,
PRIMITIVE_ID INT,
SHAPE_ID INT,
OBJECT_ID INT,
SPECTRUM_R REAL,
SPECTRUM_G REAL,
SPECTRUM_B REAL,
INTERACTION_TYPE INT,
LIGHT_ID INT
);
CREATE TABLE RIV_PATHS(
ID INT,
IMAGE_X INT,
IMAGE_Y INT,
LENS_U REAL,
LENS_V REAL,
TIMESTAMP REAL,
THROUGHPUT_ONE REAL,
THROUGHPUT_TWO REAL,
THROUGHPUT_THREE REAL,
RADIANCE_R REAL,
RADIANCE_G REAL,
RADIANCE_B REAL
);
答案 0 :(得分:1)
在未索引列中查找值时,数据库必须扫描整个表。
确保id
/ pid
列具有索引(或由于PRIMARY KEY或UNIQUE约束而具有隐式索引)。
在SQLite中,使用INSTEAD OF triggers时可以插入/更新视图。