我有一个名为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 :(得分: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 ;