2011-05-09 17 views
9

में मौजूद नहीं है तो मेरे पास टेबल टेबल concept_access और concept_access_log है। मैं एक ट्रिगर बनाना चाहता हूं जो हर समय concept_access से कुछ हटा दिया जाता है, जांचें कि लॉग तालिका में समान रिकॉर्ड है या नहीं, तो concept_access से इसे हटाए जाने से पहले नया डालें। concept_access मेंअगर ट्रिगर

DROP TRIGGER IF EXISTS before_delete_concept_access; 
DELIMITER // 
CREATE TRIGGER before_delete_concept_access 
    BEFORE DELETE ON `concept_access` FOR EACH ROW 
    BEGIN 
     IF (SELECT 1 FROM concept_access_log WHERE map=OLD.map 
          AND accesstype=OLD.accesstype AND startdate=OLD.startdate AND stopdate=OLD.stopdate) IS NULL THEN 
      INSERT INTO concept_access_log (map, accesstype, startdate, stopdate) 
      VALUES (OLD.map, OLD.accesstype, OLD.startdate, OLD.stopdate); 
     END IF; 
    END// 
DELIMITER ; 

नमूना डेटा से पहले हटा दें::

मैं ट्रिगर संशोधित और अब यह इस तरह दिखता है

map accesstype startdate stopdate 
1 public  NULL  NULL  
1 loggedin 2011-05-11 NULL  
1 friends  NULL  NULL  

लॉग तालिका में पहले से ही पहले 2 पंक्तियां हैं। और वे बिल्कुल concept_access के समान हैं। जब मैं concept_access तालिका के प्रथम पंक्ति को हटा, मैं लॉग तालिका में इस मिल:

map accesstype startdate stopdate 
1 public  NULL  NULL  
1 loggedin 2011-05-11 NULL  
1 friends  NULL  NULL  
1 public  NULL  NULL  

हालांकि यह क्योंकि (1, जनता, अशक्त, नल) पहले से ही वहां मौजूद कुछ भी डालने के लिए नहीं होता।

इस तालिका में कोई प्राथमिक कुंजी नहीं है। मैं संरचना नहीं बना रहा था, इसलिए मुझसे मत पूछो क्यों। इसे बदलने से पहले से ही बहुत सारी मौजूदा कार्यक्षमता बर्बाद हो जाएगी। मुझे बस concept_access तालिका से हटाए गए लॉग को रखने की आवश्यकता है और डुप्लीकेट के बिना इसे लॉग में स्टोर करें।

यदि कोई भी गलत हो रहा है तो यह पता लगाएगा कि मैं वास्तव में सराहना करता हूं।

+0

ठीक है, मैं क्या समस्या पता लगा है, लेकिन अभी भी उचित समाधान नहीं मिल रहा है। कुछ फ़ील्ड शून्य हो सकते हैं और, यदि OLD मान शून्य के बराबर होता है, तो 'accesstype = OLD.accesstype' जैसे कुछ काम नहीं करेगा। मैंने इसे '(accesstype = OLD.accesstype या OLD.accesstype IS NULL) में बदलने की कोशिश की, लेकिन अभी भी कोई भाग्य नहीं है ... – Jull

+0

क्या आप हमें संपूर्ण संशोधित ट्रिगर भी दिखा सकते हैं, साथ ही "concept_access" में नमूना डेटा भी दिखा सकते हैं और आपके द्वारा हटाए जाने से पहले और बाद में लॉग तालिका में रिकॉर्ड? – pilcrow

+0

@pilcrow: अपडेट – Jull

उत्तर

13
DROP TRIGGER IF EXISTS before_delete_concept_access; 
DELIMITER // 
CREATE TRIGGER before_delete_concept_access 
    BEFORE DELETE ON `concept_access` FOR EACH ROW 
    BEGIN 
     IF (SELECT COUNT(*) FROM concept_access_log WHERE map=OLD.map 
          AND accesstype=OLD.accesstype AND startdate=OLD.startdate AND stopdate=OLD.stopdate) = 0 THEN 
      INSERT INTO concept_access_log (map, accesstype, startdate, stopdate) 
      VALUES (OLD.map, OLD.accesstype, OLD.startdate, OLD.stopdate); 
     END IF; 
    END// 
DELIMITER ; 

मैं उपयोग नहीं कर रहा मौजूद है, बस अगर मिलान की तुलना में 0

अपने कोड मेरी matchine पर अच्छी तरह से चलाता है, जो आपके mysql संस्करण है अधिक से अधिक गिनती परीक्षण नहीं?

mysql> select version(); 
+------------+ 
| version() | 
+------------+ 
| 5.1.56-log | 
+------------+ 
1 row in set (0.00 sec) 
+0

संस्करण 5.1.54-1ubuntu4 – Jull

+0

वाह के शरीर में अपडेट हैं! यह अब काम करता है! आपको बहुत - बहुत धन्यवाद! – Jull

+0

@ जुल, क्या आप _exact_ ट्रिगर का उपयोग कर रहे हैं जो नियो ने पोस्ट किया है? मेरे परीक्षण में, यह उत्तर NULLs को सही तरीके से संभाल नहीं करता है, जैसा आपने ऊपर दिए गए अपने प्रश्न के जवाब में टिप्पणी की है ... – pilcrow

1

मूल्य तुल्यता की जांच करने के सबक्वेरी की कहां खंड के प्रत्येक हालत को संशोधित करने या दोनों शून्य मान:
(map = OLD.map OR COALESCE(map, OLD.map) IS NULL)
AND
(accesstype = OLD.accesstype OR COALESCE(accesstype, OLD.accesstype) IS NULL)
AND

इतने पर और पर इतना

+0

मुझे लगता है कि दूसरा विकल्प काम नहीं करेगा। मैंने पाया कि MySQL को समान मानों को बराबर नहीं दिखता है। इसलिए, अद्वितीय बाधा नल मूल्यों के साथ पंक्तियों के लिए काम नहीं करेगी। [कड़ी] (http: // stackoverflow।कॉम/प्रश्न/2520894/mysql-unique-clustered-constraint-not-constraining-as-expected) – Jull

+0

@ जूल, दाएं - उत्तर देने का उत्तर। – pilcrow

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