插入时MySQL触发器报告错误

时间:2015-05-23 10:26:06

标签: mysql

我在表上创建了一个触发器,在插入一行后将值插入到同一个表中的一列中。插入到列中的内容取决于一组验证,如下面的代码所示。

CREATE TRIGGER `FMY_NUM` AFTER INSERT ON `table_1`
   FOR EACH ROW BEGIN
   DECLARE LC_VAR INTEGER;
   CASE 
      WHEN table_1. txt_avl>= 7 THEN SET LC_VAR = 5;
      WHEN table_1.txt_avl > 9 AND table_1.txt_avl < 5000 THEN SET LC_VAR = 3;
      WHEN table_1.txt_avl > 11 AND table_1.txt_avl < 3000 THEN SET LC_VAR = 2;
      ELSE SET LC_VAR = 1;
   END CASE;
   UPDATE table_1 set table_1.v1order = LC_VAR WHERE v1Pkey = NEW.v1Pkey;   

END

我遇到的问题是,当我在表语句中运行insert时,我收到错误

MySQL说:文档

#1109 - Unknown table 'table_1' in field list 

我之前从未使用MySQL中的触发器。试着理解这个问题。有人可以帮我吗?

2 个答案:

答案 0 :(得分:3)

您的触发器存在许多问题。

首先,关于Unknown table 'table_1' in field list的错误是指您在table_1.txt_avl声明的WHEN条款中使用CASE。您似乎想要在插入的行中访问txt_avl的值,为此,您使用new.txt_avl代替。

然而,仅此变化不足以使触发器起作用。如果对触发器进行此更改,则会出现以下错误(或者至少我做了):

  

ERROR 1235(42000):此版本的MariaDB尚不支持“多个触发器,其中一个表具有相同的操作时间和事件”

此处的问题是使用UPDATE语句在同一个表的table_1触发器中更新AFTER INSERT。如果要在新行中设置列的值,可以使用SET new.v1order = LC_VAR;通过设置列的新值来执行此操作。但是,您还必须更改触发器以触发BEFORE INSERT而不是AFTER INSERT。 你不能在AFTER触发器中更改这样的列,因为在你的触发器被调用时已经太晚了 - 数据已经到达了数据库。

完成此操作后,触发器似乎可以正常工作。这是一个快速会话,我在其中创建一个表和您的触发器,插入一些数据并验证触发器是否触发并执行了某些操作:

MariaDB [blah]> create table table_1 (v1order int, v1Pkey int, txt_avl int);
Query OK, 0 rows affected (0.18 sec)

MariaDB [blah]> DELIMITER $$
MariaDB [blah]> CREATE TRIGGER `FMY_NUM` BEFORE INSERT ON `table_1`
    ->    FOR EACH ROW BEGIN
    ->    DECLARE LC_VAR INTEGER;
    ->    CASE 
    ->       WHEN new.txt_avl>= 7 THEN SET LC_VAR = 5;
    ->       WHEN new.txt_avl > 9 AND new.txt_avl < 5000 THEN SET LC_VAR = 3;
    ->       WHEN new.txt_avl > 11 AND new.txt_avl < 3000 THEN SET LC_VAR = 2;
    ->       ELSE SET LC_VAR = 1;
    ->    END CASE;
    ->    SET new.v1order = LC_VAR;
    -> END;
    -> $$
Query OK, 0 rows affected (0.06 sec)

MariaDB [blah]> DELIMITER ;
MariaDB [blah]> insert into table_1 (v1Pkey, txt_avl) values (1, 8);
Query OK, 1 row affected (0.03 sec)

MariaDB [blah]> select * from table_1;
+---------+--------+---------+
| v1order | v1Pkey | txt_avl |
+---------+--------+---------+
|       5 |      1 |       8 |
+---------+--------+---------+
1 row in set (0.00 sec)

答案 1 :(得分:0)

此错误表示您的数据库没有任何名为table_1的表