Theo như bạn kích hoạt có liên quan, có một số vấn đề:
- bạn không có
;sau khi chèn câu lệnh -
IFcâu lệnh phải kết thúc bằngEND IFvà dấu chấm phẩy, không chỉEND - bạn phải thay đổi dấu phân cách bằng
DELIMITERlệnh - sử dụng
EXISTS()thay vào đó làCOUNT()
Điều đó đang được nói rằng trình kích hoạt của bạn có thể trông giống như
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 ;
Đây là SQLFiddle bản demo
Sử dụng IGNORE trong LOAD DATA INFILE của bạn tuyên bố. MySql sẽ coi các lỗi (vi phạm ràng buộc duy nhất) là cảnh báo loại bỏ các bản sao một cách hiệu quả.
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
Lưu ý: Chèn FYI không thành công cho các hàng trùng lặp sẽ để lại khoảng trống trong các giá trị của auto_increment SCN cột.
Bạn có thể xem xét một cách tiếp cận khác có thể phù hợp hơn với hiệu suất khôn ngoan:
- tạo bảng dàn tạm thời không có ràng buộc và không có chỉ số
- sử dụng
LOAD DATA INFILEđể điền bảng giai đoạn - có
tblspmastervà bảng dàn dựng và sử dụngINSERT ... SELECTcú pháp chèn tất cả các bản sao trongtblspduplicatetrong một lần - chỉ chèn các hàng không tồn tại từ bảng dàn vào
tblspmasterlại một lần nữa -
TRUNCATEhoặcDROPbảng phân đoạn