Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gibt es eine bessere Möglichkeit, eine Textdatei mit 300.000 Zeilen zu verarbeiten und in MySQL einzufügen?

Aus Ihrem Code geht hervor, dass Ihre "eindeutige Kennung" (zumindest für die Zwecke dieser Einfügung) der zusammengesetzte (READING_DATE, READING_TIME, READING_ADDRESS) ist .

Wenn Sie einen solchen UNIQUE definieren geben Sie Ihre Datenbank ein, dann LOAD DATA mit dem IGNORE Schlüsselwort sollte genau das tun, was Sie benötigen:

ALTER TABLE tbl_reading
  ADD UNIQUE KEY (READING_DATE, READING_TIME, READING_ADDRESS)
;

LOAD DATA INFILE '/path/to/csv'
    IGNORE
    INTO TABLE tbl_reading
    FIELDS
        TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '"'
        ESCAPED BY ''
    LINES
        TERMINATED BY '\r\n'
    (@rec_0, @rec_1, @rec_2, @rec_3, @rec_4, @rec_5, @rec_6, @rec_7, @rec_8)
    SET
        READING_DATE = DATE_FORMAT(STR_TO_DATE(TRIM(@rec_0), '???'), '%Y/%m/%d'),
        READING_TIME = DATE_FORMAT(STR_TO_DATE(TRIM(@rec_1), '???'), '%H:%i:%s'),
        READING_ADDRESS    = TRIM(@rec_2),
        CO2_SET_VALUE      = TRIM(@rec_3),
        CO2_PROCESS_VALUE  = TRIM(@rec_4),
        TEMP_SET_VALUE     = TRIM(@rec_5),
        TEMP_PROCESS_VALUE = TRIM(@rec_6),
        RH_SET_VALUE       = TRIM(@rec_7),
        RH_PROCESS_VALUE   = TRIM(@rec_8)
;

(Wobei '???' werden durch Zeichenfolgen ersetzt, die die Datums- und Uhrzeitformate in Ihrer CSV-Datei darstellen).

Beachten Sie, dass Sie wirklich READING_DATE speichern sollten und READING_TIME zusammen in einem einzigen DATETIME oder TIMESTAMP Spalte:

ALTER TABLE tbl_reading
  ADD COLUMN READING_DATETIME DATETIME AFTER READING_TIME,
  ADD UNIQUE KEY (READING_DATETIME, READING_ADDRESS)
;

UPDATE tbl_reading SET READING_DATETIME = STR_TO_DATE(
  CONCAT(READING_DATE, ' ', READING_TIME),
  '%Y/%m/%d %H:%i:%s'
);

ALTER TABLE tbl_reading
  DROP COLUMN READING_DATE,
  DROP COLUMN READING_TIME
;

In diesem Fall ist das SET -Klausel des LOAD DATA Der Befehl würde stattdessen Folgendes enthalten:

READING_DATETIME = STR_TO_DATE(CONCAT(TRIM(@rec_0), ' ', TRIM(@rec_1)), '???')