トリガーする限り、いくつかの問題があります:
-
;がありません ステートメントの挿入後 -
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ステージングテーブル