0

lat、lng、latlng の 3 つの列を持つ pano_raw というテーブルがあります。

lat と lng は単なる 10 進数 (10,3) であり、latlng はタイプ POINT の空間インデックスです。

これは、緯度と経度に基づいてデータベースを更新するステートメントの例です。

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

上記のステートメントに基づいてトリガーを作成しようとしています。これにより、緯度と経度を個別に更新すると、列が自動的に更新されます。クエリが特殊化されているため、SQL を使用して毎回空間データ列を更新するのは面倒です。単純な 10 進数値をテーブルに書き込んだときに更新されるトリガーを (理論上は) 書くだけの方がはるかに簡単です。

私が抱えている問題は構文にあります。これが私のベストです(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;

これが機能するように助けていただければ幸いです。

4

1 に答える 1

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 ;
于 2011-03-28T08:32:41.737 に答える