Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy istnieje lepszy sposób na przetworzenie danych z pliku tekstowego o długości 300 000 wierszy i wstawienie ich do MySQL?

Z Twojego kodu wynika, że ​​Twój „unikalny identyfikator” (przynajmniej na potrzeby tego wstawienia) to złożony (READING_DATE, READING_TIME, READING_ADDRESS) .

Jeśli zdefiniujesz taki UNIQUE w bazie danych, a następnie LOAD DATA z IGNORE słowo kluczowe powinno robić dokładnie to, czego potrzebujesz:

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)
;

(Gdzie '???' są zastępowane ciągami, które reprezentują format daty i czasu w pliku CSV).

Pamiętaj, że naprawdę powinieneś przechowywać READING_DATE i READING_TIME razem w jednym DATETIME lub TIMESTAMP kolumna:

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
;

W takim przypadku SET klauzula LOAD DATA polecenie zawierałoby zamiast tego:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. APPARENT DEADLOCK Tworzenie wątków awaryjnych dla nieprzypisanych zadań oczekujących

  2. MySql - Czy jest gdzieś kolejka zapytań?

  3. SQLSTATE[22007]:Nieprawidłowy format daty i godziny:1366 Nieprawidłowa wartość całkowita:„nazwa_kolumny” w Laravel

  4. Gettext lub tłumaczenie bazy danych

  5. Wewnętrzne łączenie wielu z wieloma tabelami z filtrem w MySQL