Sejauh yang Anda ketahui, ada beberapa masalah:
- Anda tidak memiliki
;
setelah menyisipkan pernyataan IF
pernyataan harus diakhiri denganEND IF
dan titik koma, bukan hanyaEND
- Anda harus mengubah pembatas dengan
DELIMITER
perintah - gunakan
EXISTS()
daripadaCOUNT()
Meskipun demikian, pemicu Anda mungkin terlihat seperti
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 ;
Ini SQLFiddle demo
Gunakan IGNORE
klausa dalam LOAD DATA INFILE
penyataan. MySql akan memperlakukan kesalahan (melanggar batasan unik) sebagai peringatan yang secara efektif membuang duplikat.
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
Catatan: FYI penyisipan yang gagal untuk baris duplikat akan meninggalkan celah dalam nilai auto_increment SCN
kolom.
Anda dapat mempertimbangkan pendekatan lain yang mungkin lebih disukai dari segi kinerja:
- buat tabel staging sementara tanpa batasan dan indeks
- gunakan
LOAD DATA INFILE
untuk mengisi tabel staging - memiliki
tblspmaster
dan tabel staging dan menggunakanINSERT ... SELECT
sintaks masukkan semua duplikat ditblspduplicate
dalam sekali jalan - masukkan hanya baris yang tidak ada dari tabel pementasan ke
tblspmaster
lagi dalam sekali jalan TRUNCATE
atauDROP
meja pementasan