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;

我真的很感激帮助让这个工作。

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;

关于更新触发器,请注意

  • 第一,它必须有一个不同的名字和

  • 第二,您可能想检查哪个字段已更新,如下所示:

更新触发器

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 回答