sql >> データベース >  >> RDS >> Mysql

重複する行を別のテーブルに挿入するための挿入トリガーの前

    トリガーする限り、いくつかの問題があります:

    1. ;がありません ステートメントの挿入後
    2. IF ステートメントはEND IFで終了する必要があります ENDだけでなく、セミコロン
    3. DELIMITERで区切り文字を変更する必要があります コマンド
    4. 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 ;
    

    これがSQLFiddle です。 デモ

    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の値にギャップが残ります。 列。

    パフォーマンスの面でより望ましい可能性のある別のアプローチを検討することができます:

    1. 制約やインデックスのない一時的なステージングテーブルを作成する
    2. LOAD DATA INFILEを使用します ステージングテーブルにデータを入力するには
    3. tblspmasterを持っている ステージングテーブルとINSERT ... SELECTの使用 構文は、すべての重複をtblspduplicateに挿入します 一度に
    4. ステージングテーブルから存在しない行のみをtblspmasterに挿入します もう一度一度に
    5. TRUNCATE またはDROP ステージングテーブル



    1. SQLクエリでOracleスキーマサイズを表示するにはどうすればよいですか?

    2. MySQLdbモジュールとpipインストールMySQLdbの読み込み中にエラーが発生しました

    3. MySQLは大きなデータベースから重複をすばやく削除します

    4. PostgreSQL:6つのそれほど簡単ではない部分