2011-08-04 92 views
2

我正在尝试创建一个触发器,用于根据用户输入的纬度/经度列更新GEOMETRY列。我的触发看起来像这样 -mysql'插入后'触发器来计算基于其他字段的字段

CREATE TRIGGER `tbl.foo` 
    AFTER INSERT ON `tbl` FOR EACH ROW 
    BEGIN 
     UPDATE tbl 
     SET coord = Point(lng, lat) 
     WHERE id = NEW.id; 
    END 

不过,我得到以下错误,当我插入新行与LNG,纬度值 -

ERROR 1442(HY000):无法更新表' tbl'存储在函数/触发器中,因为它已被调用此存储函数/触发器的语句使用。

我可以不创建这样的触发器吗?如果没有,那么自动执行此操作的方法是什么?

回答

6

尝试使用BEFORE INSERT触发器并修改所需的值,例如 -

CREATE TRIGGER trigger1 
    BEFORE INSERT 
    ON table1 
    FOR EACH ROW 
BEGIN 
    SET NEW.column1 = 'another value'; 
END 

编辑

CREATE TABLE table_test_trigger (
    id INT(11) NOT NULL AUTO_INCREMENT, 
    a INT(11) DEFAULT NULL, 
    b INT(11) DEFAULT NULL, 
    c INT(11) DEFAULT NULL, 
    PRIMARY KEY (id) 
); 

DELIMITER $$ 

CREATE TRIGGER trigger1 
    BEFORE INSERT 
    ON table_test_trigger 
    FOR EACH ROW 
BEGIN 
    SET NEW.c = NEW.a + NEW.b; 
END 
$$ 

DELIMITER ; 

INSERT INTO table_test_trigger(a, b) VALUES (10, 5); 

SELECT * FROM table_test_trigger; 

+----+------+------+------+ 
| id | a | b | c | 
+----+------+------+------+ 
| 1 | 10 | 5 | 15 | 
+----+------+------+------+ 
+0

嗯...我怎么能与其他列的值更新NEW.column1除非这些列第一填充?看,应用程序允许用户输入纬度/经度值。 Point()使用这些经度/纬度值进行计算。更新:实际上,这个建议确实有效。我所要做的就是用NEW来为所有值加前缀。谢谢。 – punkish

+0

我已添加示例。 – Devart

0

根据MySQL的文档在这里找到:http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html

在存储函数或触发器,它是不允许被 语句来修改已被使用(读或写)一 表调用函数或触发器。

如果你希望坐标始终是Point(lng,lat),你可能只想把一个视图放在表格的上方,并将它作为列中的一个,然后查询视图而不是表格。

如果我想到另一种解决方法,我一定会发布它。

相关问题