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

REPLACEとAUTO_INCREMENTを使用してLOADDATAINFILEを実行しようとしています

    観察#1

    REPLACEは実行しないでください 機械的なDELETEだからです およびINSERT

    MySQLドキュメント として REPLACEについて言う

    パラグラフ2

    パラグラフ5

    REPLACEを使用すると、自動的に再利用できないTEST_IDの確立された値が破棄されます。

    観察#2

    テーブルレイアウトは、重複キーのトラップをサポートしません

    名前が一意の場合、テーブルは次のようにレイアウトする必要があります

    レイアウト#1

    CREATE TABLE  `oxygen_domain`.`TEST` (
    `TEST_ID` int(11) NOT NULL AUTO_INCREMENT,
    `NAME` varchar(255) NOT NULL,
    `VALUE` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`TEST_ID`),
    KEY (`NAME`)
    ) 
    

    名前で複数の値を使用できる場合は、テーブルを次のようにレイアウトする必要があります

    レイアウト#2

    CREATE TABLE  `oxygen_domain`.`TEST` (
    `TEST_ID` int(11) NOT NULL AUTO_INCREMENT,
    `NAME` varchar(255) NOT NULL,
    `VALUE` varchar(255) DEFAULT NULL,
    PRIMARY KEY (`TEST_ID`),
    KEY (`NAME`,`VALUE`)
    ) 
    

    提案されたソリューション

    一時テーブルを使用してすべてをキャッチします。次に、レイアウトに基づいて一時テーブルから大きなINSERTを実行します

    レイアウト#1

    VALUEを置き換えます 重複するNAMEの場合

    USE oxygen_domain
    DROP TABLE IF EXISTS `TESTLOAD`;
    
    CREATE TABLE `TESTLOAD` SELECT NAME,VALUE FROM TEST WHERE 1=2;
    
    LOAD DATA LOCAL INFILE 'C:/testData.txt'
    INTO TABLE `TESTLOAD`
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES
    (NAME, VALUE);
    
    INSERT INTO `TEST` (NAME, VALUE)
    SELECT NAME, VALUE FROM `TESTLOAD`
    ON DUPLICATE KEY UPDATE VALUE = VALUES(VALUE);
    
    DROP TABLE `TESTLOAD`;
    

    レイアウト#2

    重複する(NAME,VALUE)を無視する 行

    USE oxygen_domain
    DROP TABLE IF EXISTS `TESTLOAD`;
    
    CREATE TABLE `TESTLOAD` SELECT NAME,VALUE FROM TEST WHERE 1=2;
    
    LOAD DATA LOCAL INFILE 'C:/testData.txt'
    INTO TABLE `TESTLOAD`
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES
    (NAME, VALUE);
    
    INSERT IGNORE INTO `TEST` (NAME, VALUE)
    SELECT NAME, VALUE FROM `TESTLOAD`;
    
    DROP TABLE `TESTLOAD`;
    

    更新

    毎回テーブルの作成と削除を回避する必要がある場合。 TRUNCATE を切り捨てることができます INSERT...INTOステートメントを使用する前または後のテーブル。したがって、次回はテーブルを作成する必要はありません。



    1. MySQLバルクINSERTまたはUPDATE

    2. SQLServer2019でのtempdbの機能強化

    3. アラビア文字がデータベースに挿入されないのはなぜですか?

    4. CodeIgniter:WHERE句とOR句の使用方法