トリガーする限り、いくつかの問題があります:
-
;
がありません ステートメントの挿入後 -
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 ;
これが
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
注: 重複する行の挿入に失敗すると、auto_increment SCN
の値にギャップが残ります。 列。
パフォーマンスの面でより望ましい可能性のある別のアプローチを検討することができます:
- 制約やインデックスのない一時的なステージングテーブルを作成する
-
LOAD DATA INFILE
を使用します ステージングテーブルにデータを入力するには -
tblspmaster
を持っている ステージングテーブルとINSERT ... SELECT
の使用 構文は、すべての重複をtblspduplicate
に挿入します 一度に - ステージングテーブルから存在しない行のみを
tblspmaster
に挿入します もう一度一度に -
TRUNCATE
またはDROP
ステージングテーブル