दुर्भाग्यवश, @RuiDC द्वारा प्रदान किया गया उत्तर 5.5 से पहले MySQL संस्करणों में काम नहीं करता है क्योंकि संग्रहित प्रक्रियाओं के लिए SIGNAL का कोई कार्यान्वयन नहीं है।
समाधान मैंने पाया table_name
त्रुटि में एक अनुकूलित त्रुटि संदेश को दबाकर table_name मौजूद नहीं है
त्रुटि को फेंकने वाले सिग्नल को अनुकरण करना है।
हैक ट्रिगर्स या संग्रहीत प्रक्रिया का उपयोग करके लागू किया जा सकता है। मैं @RuiDC द्वारा उपयोग किए गए उदाहरण के बाद नीचे दिए गए दोनों विकल्पों का वर्णन करता हूं।
ट्रिगर का उपयोग करना
DELIMITER $$
-- before inserting new id
DROP TRIGGER IF EXISTS before_insert_id$$
CREATE TRIGGER before_insert_id
BEFORE INSERT ON test FOR EACH ROW
BEGIN
-- condition to check
IF NEW.id < 0 THEN
-- hack to solve absence of SIGNAL/prepared statements in triggers
UPDATE `Error: invalid_id_test` SET x=1;
END IF;
END$$
DELIMITER ;
एक संग्रहीत प्रक्रिया का उपयोग करना
संग्रहीत प्रक्रियाएं आपको गतिशील एसक्यूएल का उपयोग करने की अनुमति देती हैं, जो एक प्रक्रिया में त्रुटि उत्पादन कार्यक्षमता के encapsulation संभव बनाता है। काउंटरपॉइंट यह है कि हमें एप्लिकेशन डालने / अपडेट विधियों को नियंत्रित करना चाहिए, इसलिए वे केवल हमारी संग्रहीत प्रक्रिया का उपयोग करते हैं (INSERT / UPDATE को प्रत्यक्ष विशेषाधिकार प्रदान नहीं करते हैं)।
DELIMITER $$
-- my_signal procedure
CREATE PROCEDURE `my_signal`(in_errortext VARCHAR(255))
BEGIN
SET @sql=CONCAT('UPDATE `', in_errortext, '` SET x=1');
PREPARE my_signal_stmt FROM @sql;
EXECUTE my_signal_stmt;
DEALLOCATE PREPARE my_signal_stmt;
END$$
CREATE PROCEDURE insert_test(p_id INT)
BEGIN
IF NEW.id < 0 THEN
CALL my_signal('Error: invalid_id_test; Id must be a positive integer');
ELSE
INSERT INTO test (id) VALUES (p_id);
END IF;
END$$
DELIMITER ;