用于更新行的SQLite触发器被卡住了

时间:2012-10-17 12:52:45

标签: sqlite triggers

我正在尝试设置插入或更新点图层的属性,该属性具有从同一数据库中的多边形图层(12位分水岭标识符)派生的属性。所以这是使用SpatiaLite(SQLite的空间扩展),但这是一个细节,这应该只是一个SQL问题。

所以,我在下面创建了两个触发器。设置动作时间戳的UPDATED_ON部分效果很好。但是,无论点出现在何处,空间部分总是分配相同的值,如附图所示。它似乎对所有行执行相同的测试,输入来自一行,但是应用于错误的行。因此,触发器的SQL中的某些东西必须抓住错误的点来执行操作。是new.rowid部分吗?

CREATE TRIGGER INSERT_UDT_HUC12 AFTER INSERT ON mypoints
BEGIN
  UPDATE mypoints SET UPDATED_ON = DATETIME('NOW') WHERE rowid = new.rowid;
  UPDATE mypoints SET WBD_HUC12 =
              (SELECT HUC_12 FROM cumberland_huc12, mypoints
               WHERE st_intersects(mypoints.Geometry, cumberland_huc12.Geometry))
      WHERE mypoints.rowid = new.rowid;
END;

CREATE TRIGGER UPDATE_UDT_HUC12 AFTER UPDATE ON mypoints
BEGIN
  UPDATE mypoints SET UPDATED_ON = DATETIME('NOW') WHERE rowid = new.rowid;
  UPDATE mypoints SET WBD_HUC12 =
              (SELECT HUC_12 FROM cumberland_huc12, mypoints
               WHERE st_intersects(mypoints.Geometry, cumberland_huc12.Geometry))
      WHERE mypoints.rowid = new.rowid;
END 

Example map

1 个答案:

答案 0 :(得分:1)

返回新分水岭标识符的子查询如下:

SELECT HUC_12 FROM cumberland_huc12, mypoints
WHERE st_intersects(mypoints.Geometry, cumberland_huc12.Geometry)

请注意,这会返回与mypoints任何点相交的所有分水岭。 因此,您的触发器将收到恰好是此查询中的第一个触发器。

您还必须在子查询中使用过滤器WHERE mypoints.rowid = new.rowid