जहां तक आप ट्रिगर का संबंध रखते हैं, वहां कई समस्याएं हैं:
- आपके पास
;
बयान डालने के बाद IF
स्टेटमेंट के अंत मेंEND IF
होना चाहिए और एक अर्धविराम, न कि केवलEND
- आपको
DELIMITER
के साथ एक सीमांकक बदलना होगा आदेश EXISTS()
का उपयोग करें इसके बजायCOUNT()
कहा जा रहा है कि आपका ट्रिगर ऐसा दिखाई दे सकता है
DELIMITER $$
CREATE TRIGGER tblspmaster_noduplicate
BEFORE INSERT ON tblspmaster
FOR EACH ROW
BEGIN
IF (EXISTS(SELECT * FROM tblspmaster WHERE sp = NEW.sp)) THEN
INSERT INTO tblspduplicate (sp,FileImported,AMZFileName)
VALUES (NEW.sp, NEW.FileImported, NEW.AMZFileName);
END IF;
END$$
DELIMITER ;
यह रहा SQLFiddle डेमो
IGNORE
का प्रयोग करें आपके LOAD DATA INFILE
. में क्लॉज बयान। MySql त्रुटियों (अद्वितीय बाधाओं का उल्लंघन) को प्रभावी ढंग से डुप्लिकेट को हटाने वाली चेतावनियों के रूप में मानेगा।
LOAD DATA LOCAL INFILE 'E://31october//SP//sp_files_sample1//400k sp00 6-19 E.csv'
IGNORE
INTO TABLE tblspmaster
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\'
LINES TERMINATED BY '\n'
-- IGNORE 1 LINES
नोट: डुप्लिकेट पंक्तियों के लिए FYI विफल सम्मिलन auto_increment SCN
के मानों में अंतराल छोड़ देगा स्तंभ।
आप एक अन्य दृष्टिकोण पर विचार कर सकते हैं जो प्रदर्शन के लिहाज से अधिक बेहतर हो सकता है:
- बिना किसी बाधा और बिना किसी इंडेक्स के अस्थायी स्टेजिंग टेबल बनाएं
LOAD DATA INFILE
का उपयोग करें स्टेजिंग टेबल को भरने के लिएtblspmaster
होने और स्टेजिंग टेबल औरINSERT ... SELECT
. का उपयोग करके सिंटैक्सtblspduplicate
. में सभी डुप्लीकेट डालें एक बार में- स्टेजिंग टेबल से केवल गैर-मौजूद पंक्तियों को
tblspmaster
में डालें फिर से एक बार में TRUNCATE
याDROP
मंचन तालिका