mysql'插入'触发器根据其他字段计算字段

时间:2011-08-04 13:13:42

标签: mysql sql triggers

我正在尝试创建一个触发器,它将根据用户输入的lat / lng列更新GEOMETRY列。我的触发器看起来像这样 -

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,lat值 -

插入新行时,出现以下错误
  

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

我可以不创建这样的触发器吗?如果没有,自动化的方法是什么?

2 个答案:

答案 0 :(得分: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 |
+----+------+------+------+

答案 1 :(得分:0)

根据此处的MySQL文档:http://dev.mysql.com/doc/refman/5.0/en/stored-program-restrictions.html

  

在存储的函数或触发器中,不允许修改a   已经被使用(用于读或写)的表   调用函数或触发器的语句。

如果你想让coord始终是Point(lng,lat),你可能只想把一个视图置于表格的上方并将其作为其中一列,然后查询视图而不是表格。

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