长话短说,在SQLite中,我有一个sortOrder字段,它可以处理表中项目的可变排序顺序。我有触发器:
Inesrt之后:如果>触发器将所有sortOrder字段更新+1。而不是插入的字段。
删除后:触发器将所有sortOrder字段更新为-1,如果它们是>比删除的那个字段。
更新(sortOrder)。这会在sortOrder字段中添加或减去,具体取决于数字是移动得高于还是低于其之前的位置。
现在问题。所有更新表设置sortOrder =触发On Update的任何内容。
那么有没有办法在其他触发功能期间关闭更新?
答案 0 :(得分:0)
使此表成为一个只从基表中获取数据的视图。 实现INSERT / UPDATE / DELETE的INSTEAD OF触发器,将所有操作重定向到基表。 然后,您可以更新基表中的排序顺序,而不会触发任何触发器。
使用程序中的代码更新排序顺序可能更容易。
答案 1 :(得分:0)
好吧,我找到了办法。有些人不喜欢它,我确定,但它做了同样的事情,必须在代码中完成。有人可能想设置一个布尔变量来表示我们正在填充一个框,以便事件OnChange可以检查它而不做任何事情。
所以,因为这只是一个测试,所以这个表叫做testTbl,而且id行有一个名为sortOrder的整数行。这是调用AFTER INSERT的触发器。它允许插入sortOrder,并确保它出现在适当的位置。
DROP TRIGGER "main"."trig_testTbl";
CREATE TRIGGER "main"."trig_testTbl" AFTER INSERT ON "testTbl" FOR EACH ROW
BEGIN
/* tell the trigUpdate table that we're updating*/
UPDATE trigUpdate SET doNotUpdate = 1 WHERE tblName = 'testTbl';
/* do what we need to do */
UPDATE testTbl SET sortOrder = sortOrder + 1
WHERE sortOrder >= New.sortOrder
AND rowid <> New.rowid;
/* Tell it we're done*/
UPDATE trigUpdate SET doNotUpdate = 0 WHERE tblName = 'testTbl';
END;
在BEGIN在名为trigUpdate的表中将字段设置为1(True)之后,您将注意到第一行。
这是sortOrder的AFTER UPDATE的WHEN子句。有两个触发器在sortOrder上都被称为AFTER UPDATE。一种是当新的sortOrder小于旧的sortOrder时,另一种是反之亦然。
New.SortOrder&gt; Old.SortOrder And(SELECT doNotUpdate FROM trigUpdate WHERE tblName =&#39; testTbl&#39;)&lt;&gt; 1