【问题标题】:TRIGGER based on spatial data基于空间数据的TRIGGER
【发布时间】:2011-03-28 07:35:43
【问题描述】:

我有一个名为 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;

非常感谢您帮助我完成这项工作。

【问题讨论】:

    标签: mysql sql triggers spatial-index


    【解决方案1】:

    这不起作用?

    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 ;
    

    【讨论】:

    • 未知系统变量'latlng'
    • @Phil:抱歉,已更正。不确定PointFromWKB()POINT() 是否会做你想做的事。
    • DELIMITER $$ 创建触发器 trig_pano_raw_up 在更新 pano_raw 之前为每一行开始更新 pano_raw SET latlng = PointFromWKB( POINT( NEW.lat, NEW.lng ) ); END$$ 分隔符;
    • 另外:NEW.lngNEW.lat 之间的字符串中缺少逗号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-15
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    相关资源
    最近更新 更多