如何使用SQLite限制递归触发器中的行插入?

时间:2013-11-04 16:08:46

标签: sqlite

首先,我直接在SQLite数据库管理软件中查询。因此,在我的情况下,任何编程语言的使用都是不可能的,我唯一的选择就是使用触发器。

我的数据库有一个名为 Article 的表格,我希望用 n 虚拟对象填充测试purpposes而不会达到触发器的递归限制(限制我无法改变,因为我将不得不重新编译数据库)。我想通过阅读官方文档,这个限制默认固定为500.

到目前为止,我已经创建了一个函数触发器,但是在 n 插入后我无法停止它的递归:

CREATE TRIGGER 'myTrigger' 
AFTER INSERT ON 'Article' 
WHEN (insertedRowNumber < 500) 
BEGIN 
    INSERT INTO Article(...) VALUES(...); 
END;

文章表结构不包含任何类型的时间戳,因为数据库已经部署用于生产,所以无法更改。

如何限制使用我提供的触发器模式插入的行数?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果您可以限制Article中的条目而不是插入次数,只需:

CREATE TRIGGER myTrigger AFTER INSERT ON Article WHEN ((SELECT COUNT() FROM Article)<500) BEGIN INSERT INTO Article(...) VALUES(...); END;

另一个选择是使用辅助视图:

CREATE VIEW hlpArticle(a, ..., z, hlpCnt) AS SELECT a, ..., z, 1 AS hlpCnt FROM Article;
CREATE TRIGGER hlpTrigger INSTEAD OF INSERT ON hlpArticle WHEN (NEW.hlpCnt>0) BEGIN
    INSERT INTO Article(a, ..., z) VALUES(NEW.a, ..., NEW.z);
    INSERT INTO hlpArticle(a, ..., z) VALUES(NEW.a, ..., NEW.z, NEW.hlpCnt-1);
END;

所以当你这样做时:

INSERT INTO hlpArticle(a, ..., z, hlpCnt) VALUES('val_a', ..., 'val_z', 500);

它会在Article上插入500条记录。