MYSQL Trigger работает, если я использую «после обновления», но не «после вставки»? - PullRequest
5 голосов
/ 10 февраля 2012

Я написал триггер для вставки строки в таблицу b после операции над таблицей a.По какой-то причине это не имеет никакого эффекта, если я добавлю этот триггер «после вставки», а затем вставлю строку.Однако, это работает, если я добавлю триггер как «после обновления» и обновлю строку.

Вот код триггера.Когда я заменяю «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 ;

1 Ответ

1 голос
/ 08 ноября 2012

На MySQL 5.5.20 с таблицами InnoDB я воспроизвел вашу ситуацию в упрощенном тесте.оба, вставка с использованием результата из таблицы триггеров, которая ссылается на новый ряд строк, и прямая вставка с использованием НОВЫХ значений работали нормально

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, так и для явно вставленных значений.Ваша проблема должна быть где-то еще

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...