首页 文章

mysql 'after insert'触发器根据其他字段计算字段

提问于
浏览
3

我正在尝试创建一个触发器,它将根据用户输入的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值的新行时,我收到以下错误 -

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

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

2 回答

  • 6

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

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

    EDIT

    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

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

    在存储的函数或触发器中,不允许通过调用函数或触发器的语句修改已经使用(用于读取或写入)的表 .

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

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

相关问题