2011-03-28 80 views
0

我有一個名爲pano_raw的表,它有3列lat,lng和latlng。基於空間數據的觸發器

lat和lng只是小數(10,3),latlng是POINT類型的空間索引。

這是一個基於lat和lng更新數據庫的示例語句。

INSERT INTO pano_raw (latlng) VALUES(GeomFromText('POINT(-72.34 32.45)')); 

我想創建一個基於上述語句的觸發器,當我單獨更新lat和lng時,它會自動更新列。由於查詢是專用的,每次使用SQL都會更新空間數據列。只寫一個觸發器(理論上)會更容易,當我向表中寫入一個簡單的十進制值時它將更新。

我遇到的問題是語法問題。這是我的最好的(2小時拍攝)。

SET @sql := CONCAT('POINT(',pano_raw.lng,' ',pano_raw.lat,')'); 

CREATE TRIGGER trig_pano_raw BEFORE INSERT ON pano_raw 
FOR EACH ROW 
BEGIN 
    SET pano_raw.latlng = GeomFromText(@sql)); 
END; 
CREATE TRIGGER trig_pano_raw BEFORE UPDATE ON pano_raw 
FOR EACH ROW 
BEGIN 
    SET pano_raw.latlng = GeomFromText(@sql)); 
END; 

我真的很感謝幫助得到這個工作。

回答

0

這不行?

CREATE TRIGGER trig_pano_raw BEFORE INSERT ON pano_raw 
FOR EACH ROW 
BEGIN 
    SET NEW.latlng = PointFromWKB(POINT(NEW.lat, NEW.lng)); 
END; 

關於更新觸發,注意

  • 月1日,它必須有一個不同的名稱和

  • 2,您可能要檢查該字段被更新,這樣:

更新觸發

DELIMITER $$ 
CREATE TRIGGER trig_Update_pano_raw BEFORE UPDATE ON pano_raw 
FOR EACH ROW 
BEGIN 
    IF ((NEW.lat != OLD.lat) OR (NEW.lng != OLD.lng)) 
    THEN 
     SET NEW.latlng = PointFromWKB(POINT(NEW.lat, NEW.lng)); 
    ELSEIF (NEW.latlng != OLD.latlng) 
    THEN 
     BEGIN 
      SET NEW.lat = X(NEW.latlng); 
      SET NEW.lng = Y(NEW.latlng); 
     END; 
    END IF; 
END;$$ 
DELIMITER ; 
+0

未知系統變量'latlng' – 2011-03-28 15:59:27

+0

@Phil:對不起,更正了它。不知道'PointFromWKB()'和'POINT()'是否會做你想要的。 – 2011-03-28 16:04:26

+0

DELIMITER $$ CREATE TRIGGER trig_pano_raw_up BEFORE UPDATE ON pano_raw FOR EACH ROW BEGIN \t \t UPDATE pano_raw SET經緯度= PointFromWKB(POINT(NEW.lat,NEW.lng)); END $$ DELIMITER; – 2011-03-28 16:13:29