2012-02-10 27 views
5

मैंने तालिका ए पर एक ऑपरेशन के बाद तालिका बी में एक पंक्ति डालने के लिए एक ट्रिगर लिखा है। किसी कारण से, इसका कोई प्रभाव नहीं पड़ता है यदि मैं इस ट्रिगर को 'डालने के बाद' जोड़ता हूं और फिर एक पंक्ति डालता हूं। हालांकि, यह काम करता है अगर मैं ट्रिगर को 'अपडेट के बाद' के रूप में जोड़ता हूं, और पंक्ति को अद्यतन करता हूं।MYSQL ट्रिगर काम करता है अगर मैं 'अद्यतन के बाद' उपयोग करता हूं लेकिन 'डालने के बाद' नहीं?

यहां ट्रिगर कोड है। जब मैं 'अद्यतन के बाद' के साथ 'अद्यतन के बाद' को प्रतिस्थापित करता हूं, और एक सम्मिलित करता हूं, तो जब कोई नई पंक्ति डालने पर कुछ भी नहीं होता है। ट्रिगर बनाने के दौरान मुझे कोई त्रुटि नहीं मिलती है, और मैं उसी तालिका को अपडेट करने की कोशिश नहीं कर रहा हूं जिस पर ट्रिगर सेट किया जा रहा है। किसी भी मदद की सराहना की है! धन्यवाद, जेन

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

+0

ट्रिगर के बिना इस व्यवहार को पुन: उत्पन्न करने का प्रयास करें। चयन कथन निष्पादित करें। क्या यह किसी भी पंक्ति को वापस कर देगा? – Devart

+0

@perissf - आपके उत्तर के लिए धन्यवाद। यह मुद्दा "संग्रहीत फ़ंक्शन या ट्रिगर के भीतर है, इसे उस तालिका को संशोधित करने की अनुमति नहीं है जिसे पहले से ही इस्तेमाल किया जा रहा है (पढ़ने या लिखने के लिए) उस कथन द्वारा जो फ़ंक्शन या ट्रिगर को बुलाया गया है।" जबकि मैं वास्तव में जिराइज़ू टेबल पढ़ रहा हूं, मैं इसे अपडेट नहीं कर रहा हूं। और यह स्पष्ट नहीं करता कि ऐसा क्यों लगता है कि अगर मैं इसे 'अद्यतन के बाद' चलाता हूं, लेकिन 'इन्टरर्ट के बाद' नहीं? – jen

उत्तर

1

InnoDB तालिकाओं के साथ MySQL 5.5.20 पर मैं एक सरल परीक्षा में अपनी स्थिति reproduced गए हैं। दोनों, ट्रिगर तालिका जो 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); 

सीधे नए मूल्यों से डाला काम किया

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

चयन परिणाम

01 से सम्मिलित किया गया

तो यह auto_increment और स्पष्ट रूप से सम्मिलित मान दोनों के लिए काम करता है। आपकी समस्या कहीं और होनी चाहिए

संबंधित मुद्दे