如果我使用 'after update' 但不使用 'after insert',MYSQL 触发器是否有效?

标签 mysql database triggers

我编写了一个触发器,在对表 a 执行操作后向表 b 中插入一行。 出于某种原因,如果我在“插入后”添加此触发器然后插入一行,它没有任何效果。但是,如果我将触发器添加为“更新后”并更新行,它确实有效。

这是触发代码。当我将“AFTER UPDATE”替换为“AFTER INSERT”并进行插入时,插入新行时没有任何反应。创建触发器时我没有收到任何错误,并且我没有尝试更新设置触发器的同一个表。 任何帮助表示赞赏! 谢谢, 仁

drop trigger if exists insertUndecided;  
DELIMITER //  
CREATE TRIGGER insertUndecided  
     AFTER UPDATE ON jiraissue
     FOR EACH ROW
     BEGIN
        insert into nodeassociation (SOURCE_NODE_ID, SOURCE_NODE_ENTITY, SINK_NODE_ID, SINK_NODE_ENTITY, ASSOCIATION_TYPE, SEQUENCE)
   select
      NEW.id as SOURCE_NODE_ID,
      'Issue' as SOURCE_NODE_ENTITY,
      (select pv.id from projectversion pv
         where pv.vname='undecided'
         and pv.project=NEW.project ) as SINK_NODE_ID,
      'Version' as SINK_NODE_ENTITY,
      'IssueFixVersion' as ASSOCIATION_TYPE,
      NULL as SEQUENCE

   from dual  where exists
      (select pkey from jiraissue
         where id=NEW.id and id not in
            (select distinct source_node_id from nodeassociation
               where source_node_entity='Issue' and SINK_NODE_ENTITY='Version'
               and ASSOCIATION_TYPE='IssueFixVersion') );

 END;//

DELIMITER ;

最佳答案

在带有 InnoDB 表的 MySQL 5.5.20 上,我在简化测试中重现了您的情况。 两者都使用引用新行的触发器表中的结果插入并使用新值直接插入工作正常

CREATE TABLE test1(a1 INT NOT NULL auto_increment, b1 INT, PRIMARY KEY (a1) );
CREATE TABLE test2(a1 INT, b1 INT);
CREATE TABLE test3(a1 INT, b1 INT);

DELIMITER ;;

CREATE TRIGGER testAI AFTER INSERT ON test1
  FOR EACH ROW BEGIN
    INSERT INTO test2 SET a1 = NEW.a1, b1 = NEW.b1;
    INSERT INTO test3 ( a1, b1 ) SELECT a1, b1 FROM test1 WHERE a1 = NEW.a1;
  END;
;;

DELIMITER ;

扣动扳机

INSERT INTO test1 (b1) VALUES (1),(2),(3);

直接从新值插入

mysql> SELECT * FROM test2;
+------+------+
| a1   | b1   |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
+------+------+
3 rows in set (0.00 sec)

从 SELECT 结果中插入

mysql> SELECT * FROM test3;
+------+------+
| a1   | b1   |
+------+------+
|    1 |    1 |
|    2 |    2 |
|    3 |    3 |
+------+------+
3 rows in set (0.00 sec)

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.5.20    |
+-----------+
1 row in set (0.00 sec)

因此这适用于 auto_increment 和显式插入的值。 你的问题一定在别的地方

关于如果我使用 'after update' 但不使用 'after insert',MYSQL 触发器是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9224477/

相关文章:

c# - 从散列值中取回值?

debugging - 如何测试 GAS 中的触发功能?

mysql - 从 MySQL 中的 JSON 数组中删除所有 JSON 对象

php - PDO 连接未显示所有错误

angularjs - OrderCloud.io API XP 大小限制

sql - 数据库触发器 : comparison of column value with empty variable

mysql - symfony 1.4,$this->save() 和 mysql 插入触发器

php - 表中有超过 20 万行,脚本加载时间超过 20 秒

c# - 如何编写一列返回多个结果的SQL查询C#

php - Zend Framework 1.9 从数据库查询中填充复选框