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 -
IF
câu lệnh phải kết thúc bằngEND IF
và dấu chấm phẩy, không chỉEND
- bạn phải thay đổi dấu phân cách bằng
DELIMITER
lệ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ó
tblspmaster
và bảng dàn dựng và sử dụngINSERT ... SELECT
cú pháp chèn tất cả các bản sao trongtblspduplicate
trong một lần - chỉ chèn các hàng không tồn tại từ bảng dàn vào
tblspmaster
lại một lần nữa -
TRUNCATE
hoặcDROP
bảng phân đoạn