2012-10-17 40 views
2

我試圖設置插入或更新點屬性的圖層屬性,該屬性來自同一個數據庫中的多邊形圖層(12位分水嶺標識符)。所以這是使用SpatiaLite(SQLite的空間擴展),但這是一個細節,這應該只是一個SQL問題。更新行的SQLite觸發器被卡住

所以,我在下面創建了兩個觸發器。 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

,返回新的分水嶺標識符是如下的子查詢:

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

注意它返回所有流域相交mypoints任何點。 因此,您的觸發器將會收到恰好是此查詢中第一個的觸發器。

您還必須在子查詢中使用篩選器WHERE mypoints.rowid = new.rowid

+0

是的,這是做到了。我盯着這個很長一段時間,並沒有發現這種遺漏。謝謝! – JohnZastrow