2012-02-10 35 views
5

我已經寫了一個觸發器,以便在對錶a執行操作之後向表b中插入一行。 出於某種原因,如果我在插入後添加此觸發器,然後插入一行,它將不起作用。但是,如果我將觸發器添加爲「更新後」,並且更新該行,則它可以工作。如果我使用'更新後'但不'後插入'MYSQL觸發器的作品?

這裏是觸發代碼。當我用'AFTER INSERT'替換'AFTER UPDATE',並進行插入時,當我插入一個新行時,沒有任何反應。在創建觸發器時我沒有遇到任何錯誤,而且我也沒有嘗試更新觸發器正在設置的同一個表。 任何幫助表示讚賞! 感謝, 仁

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 ; 
+0

看到這個答案,似乎也適用於你的情況,以及:http://stackoverflow.com/a/9097459/870122 – perissf 2012-02-10 08:08:12

+0

嘗試重現這種行爲沒有觸發。執行SELECT語句。它會返回任何行嗎? – Devart 2012-02-10 08:23:02

+0

@perissf - 感謝您的回覆。該問題是關於「在存儲的函數或觸發器中,不允許修改調用該函數或觸發器的語句已在使用(用於讀取或寫入)的表」。雖然我的確在閱讀jiraissue表,但我並沒有更新它。這並不能解釋爲什麼它似乎工作,如果我運行'後更新',但不是'後插入'? – jen 2012-02-10 17:28:19

回答

1

在MySQL 5.5.20與InnoDB表我已經轉載了一個簡化的測試你的情況。 兩者,使用結果從被參照新行alreay和直接使用新值插入觸發器表中插入工作得很好

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); 

直接從NEW值插入

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

從SELECT結果

01插入

所以這適用於auto_increment和明確插入的值。 你的問題必須在其他地方