2010-03-29 15 views
29

मेरे पास एक सारणी है जिसमें एक यूआरएल और एक स्ट्रिंग है जो इसके पैरामीटर का प्रतिनिधित्व करती है। समस्या यह है कि मैं एक यूआरएल और पैरामीटरस्ट्रिंग को टेबल के लिए अनन्य बाधा बनना चाहता हूं - उर्फ ​​नो प्रविष्टियों में एक ही यूआरएल और पैरामीटर स्ट्रिंग हो सकती है। पैरामीटर स्ट्रिंग मनमाने ढंग से लम्बाई हो सकती है (800bytes से अधिक या तो जो MySQL कुंजी के लिए अधिकतम लंबाई है, इसलिए मैं अनन्य (यूआरएल, पैराम्स) का उपयोग नहीं कर सकता क्योंकि यह एक त्रुटि फेंकता है ...)।MySQL ट्रिगर में INSERT ऑपरेशन को कैसे रोकें?

मैंने ऐसा करने के लिए ट्रिगर्स का उपयोग करने के बारे में सोचा, लेकिन अगर ट्रिगर पता लगाता है तो डुप्लिकेट एंट्री डालने के बारे में एक अपवाद फेंक सकता है या एक त्रुटि कैसे बढ़ा सकता है? मुझे कल्पना है कि मैं माईएसक्ल की तरह माइस्क्लएक्सप्शन फेंकना चाहता हूं जैसे डुप्लिकेट प्राथमिक कुंजी इत्यादि। इसलिए मैं इसे अपने सी # कोड में पकड़ सकता हूं।

मेरे पास ट्रिगर में दो टुकड़े हैं जिनके लिए मुझे सहायता प्राप्त करने की आवश्यकता है: ... सी # को अपवाद फेंक दें ... मैं सी # को अपवाद कैसे फेंक सकता हूं? ... सम्मिलित करने की अनुमति दें ... - यदि कोई डुप्लिकेट प्रविष्टि नहीं है तो मैं केवल डालने की अनुमति कैसे दूं?

यहाँ ट्रिगर कोड:

CREATE TRIGGER urls_check_duplicates 
BEFORE INSERT ON urls 
FOR EACH ROW 

BEGIN 
DECLARE num_rows INTEGER; 

SELECT COUNT(*) 
INTO num_rows 
FROM urls 
WHERE url = NEW.url AND params = NEW.params; 

IF num_rows > 0 THEN 
    ... ABORT/throw exception to C# ... 
ELSE 
    ... Allow insert ... 
END 
+0

MySQL 5.5 से, संभवतः पहले, आप संकेतों का उपयोग कर सकते हैं, [1] [1] [मेरा उत्तर यहाँ देख] इन-माइस्क्ल-ट्रिगर/718 9 3 9 6 # 718 9 3 9 – RuiDC

उत्तर

6

यदि आपकी तालिका परिभाषा एक पूर्ण मूल्य के लिए नहीं है, तो आप न्यू को न्यूएल सेट कर सकते हैं, जो प्रभावी रूप से सम्मिलित नहीं करेगा। ठीक से काम करने के लिए आपको सख्त एसक्यूएल मोड चालू करना पड़ सकता है।

67

मैं इस पर आया और हालांकि समाधान काम करता है, बाद में मुझे एक बेहतर समाधान की तरह मुझे लगता है। मुझे संदेह है कि यह एक विकल्प नहीं था जब इस सवाल का मूल रूप से उत्तर दिया गया था।

CREATE TRIGGER `TestTable_SomeTrigger` 
BEFORE UPDATE ON `test_table` 
FOR EACH ROW 
BEGIN 
    DECLARE msg VARCHAR(255); 
    IF (SomeTestToFail = "FAIL!") THEN 
     set msg = "DIE: You broke the rules... I will now Smite you, hold still..."; 
     SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg; 
    END IF; 

    -- Do any other code here you may want to occur if it's all OK or leave blank it will be 
    -- skipped if the above if is true 
END$$ 

यह अब एक अच्छा (या बुरा!) त्रुटि संदेश लौटाएगा जिसे आप जाल कर सकते हैं। इस पर अधिक जानकारी के लिए देखें: http://dev.mysql.com/doc/refman/5.5/en/signal.html

मुझे उम्मीद है कि यह किसी और की मदद करेगा! http://stackoverflow.com/questions/24/throw-error-:

+2

यह वाकई अद्भुत है। मेरे लिए काम किया – rishad2m8

+1

धन्यवाद। मुझे एक टेबल रखने और गैर ओवरलैपिंग श्रेणियों को लागू करने की आवश्यकता थी और इससे मुझे ऐसा करने में मदद मिली। – Kickstart

+1

यह स्वीकार्य उत्तर होना चाहिए ... यूपी वोट! – smashing

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