2011-03-28 1 views
0

lat, lng 및 latlng 3 열을 포함하는 pano_raw라는 테이블이 있습니다.공간 데이터를 기반으로하는 트리거

lat 및 lng는 소수 (10,3)이며 latlng는 POINT 유형의 공간 인덱스입니다.

이것은 lat 및 lng를 기반으로 데이터베이스를 업데이트하는 명령문입니다.

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

는 제가 별도로 위도와 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; 

  • 첫째, 그것은 다른 이름과

  • 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' –

+0

@Phil : 죄송합니다. 수정했습니다. 'PointFromWKB()'와'POINT()'가 당신이 원하는 것을 할 수 있을지 확신 할 수 없습니다. –

+0

DELIMITER $$ 가 \t \t 업데이트 pano_raw을 BEGIN EACH ROW FOR pano_raw ON UPDATE 전에 트리거 trig_pano_raw_up을 만들 SET 위도와 경도 = PointFromWKB (POINT (NEW.lat, NEW.lng)); END $$ DELIMITER; –