Sqlite 是否有方法防止在删除和/或插入触发器内触发更新触发器?
长话短说,在SQLite中,我有一个sortOrder字段,用于处理表中项目的可变排序顺序。我认为: Inesrt之后:如果所有sortOrder字段大于插入的字段,则触发器将其更新+1 删除后:如果所有sortOrder字段大于已删除字段的值,则触发器将其更新为-1 在更新排序器时。这将根据数字是移到高于还是低于其上一个点的位置,从排序器字段中进行加减 现在问题来了。所有更新表集合sortOrder=在更新时触发的内容Sqlite 是否有方法防止在删除和/或插入触发器内触发更新触发器?,sqlite,triggers,Sqlite,Triggers,长话短说,在SQLite中,我有一个sortOrder字段,用于处理表中项目的可变排序顺序。我认为: Inesrt之后:如果所有sortOrder字段大于插入的字段,则触发器将其更新+1 删除后:如果所有sortOrder字段大于已删除字段的值,则触发器将其更新为-1 在更新排序器时。这将根据数字是移到高于还是低于其上一个点的位置,从排序器字段中进行加减 现在问题来了。所有更新表集合sortOrder=在更新时触发的内容 那么,有没有办法在其他触发函数期间关闭更新功能?将此表设置为仅从基表获取数
那么,有没有办法在其他触发函数期间关闭更新功能?将此表设置为仅从基表获取数据的视图。 实现INSERT/UPDATE/DELETE的INSERT OF触发器,将所有操作重定向到基表。 然后,您可以在不触发任何触发器的情况下更新基表中的排序顺序
使用程序中的代码更新排序顺序可能更容易。我找到了一种方法。我敢肯定,有些人会不喜欢它,但它做的事情和当时必须在代码中完成的事情是一样的。有人可能想设置一个布尔变量,表示我们正在填充一个框,以便事件OnChange可以检查它,而不做任何事情 因此,由于这都是一个测试,所以该表被称为testTbl,它和一个id行都有一个整数行,名为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更新后的WHEN子句。有两个触发器都是在sortOrder上更新后调用的。一个是当新的排序器小于旧的排序器时,另一个是vica versa
New.SortOrder>Old.SortOrder并从trigUpdate中选择doNotUpdate,其中tblName='testTbl'1如何通过指定WHEN语句和/或在更新时使用而不是在更新时使用simple来修改更新时触发器?我不确定您的解决方案看起来有多完整,但这可能会有所帮助?我正在使用的更新,但这是其他触发器中正在更新的字段。我很想去哪里,但是在哪里呢?触发时有触发器吗?你说得对。从代码中执行可能更容易。问题是,我希望INSERT或DELETE触发器触发,而不会导致在其他两个触发器中更改的每个排序器触发UPDATE触发器。ie:INSERT:updatetesttbl SET sortOrder=sortOrder+1,其中sortOrder>=New.sortOrder和rowid New.rowid;运行此操作时,它会调用每个记录的更新。