Загрузить CSV-файл, содержащий миллион значений в определенный столбец в MySQL

База данных: MySQL

CSV-файл, содержащий около миллиона записей, например:

234546,345674,464368,563236,684269,707853,...

Данные должны быть добавлены в БД следующим образом:

id|number|status| ...
-----------------------
 1|234546| ...  | ...
 2|345674| ...  | ...
 3|464368| ...  | ...
 4|563236| ...  | ...
 5|684269| ...  | ...
 6|707853| ...  | ...

Я нашел несколько способов загрузки файла CSV, когда файл CSV содержит значения для каждого столбца. Но здесь, в моем случае, я должен вставить значения в определенный столбец. Каков эффективный способ сделать это в Java?

4 ответа

Решение

Самый быстрый способ загрузить данные из файла LOAD DATA INFILE, Попробуй это так

LOAD DATA LOCAL INFILE '/path/to/your/file.csv'
IGNORE -- use this if you have duplicate numbers in the file and UNIQUE constraint defined on `number` column
INTO TABLE table1
FIELDS TERMINATED BY ','
LINES TERMINATED BY ','
(number)

Давай попробуем

mysql> CREATE TABLE Table1
    -> (
    ->   `id` int не нулевой первичный ключ auto_increment, 
    ->   `number` int, 
    ->   `status` varchar(32)
    ->);
Запрос в порядке, затронуто 0 строк (0,13 с)

MySQL> 
mysql> ЛОКАЛЬНЫЙ INFILE ЗАГРУЗКИ ДАННЫХ '/tmp/test.csv'
    -> В ТАБЛИЦУ table1
    -> ПОЛЯ, ПРЕКРАЩЕННЫЕ ','
    -> ЛИНИИ, ПРЕКРАЩЕННЫЕ ','
    -> (число);
Запрос в порядке, затронуто 6 строк (0,00 с)
Записи: 6 Удалено: 0 Пропущено: 0 Предупреждений: 0

mysql> select * from table1;
+----+--------+--------+
| id | номер | статус |
+----+--------+--------+
|  1 | 234546 | NULL   |
|  2 | 345674 | NULL   |
|  3 | 464368 | NULL   |
|  4 | 563236 | NULL   |
|  5 | 684269 | NULL   |
|  6 | 707853 | NULL   |
+----+--------+--------+
6 рядов в наборе (0,00 сек)

ОБНОВЛЕНИЕ: Если вам нужно выполнить некоторые базовые преобразования или проверки, вы можете использовать SET предложение вместе с пользовательскими переменными

LOAD DATA LOCAL INFILE '/path/to/your/file.csv'
IGNORE INTO TABLE table1
FIELDS TERMINATED BY ','
LINES TERMINATED BY ','
(@number)
SET number = CONCAT('prefix', @number)

Я предлагаю использовать скрипт оболочки bash для непосредственного решения этой проблемы вместо использования Java. Мы можем выполнить следующие шаги:

Сначала сгенерируйте операторы SQL для вставки:

tr ',' '\ n' insert.sql

  • tr ',' '\ n'
  • grep -v "^[ \t]*$": удалить пустые строки;
  • awk...> insert.sql: добавить в него ключевые слова SQL.

Результат может выглядеть так:

ВСТАВЬТЕ В ВАШЕ ЗНАЧЕНИЕ (id, number) (1, 234546)

ВСТАВЬТЕ В ВАШУ СТОИМОСТЬ (id, номер) (2, 345674)

ВСТАВЬТЕ В СВОЙ СТОИМОСТЬ (id, номер) (3, 464368)

ВСТАВЬТЕ В ВАШЕ ЗНАЧЕНИЕ (id, number) (4, 563236)

Затем выполните эти вставки SQL:

mysql -uUSERNAME -pPASSWORD -hHOST < insert.sql
  1. Делать id поле AUTO_INCREMENT.
  2. Установите значения по умолчанию для других полей.
  3. Используйте LOAD DATA INFILE, чтобы вставить только одно поле - numberи установите ',' в качестве разделителя строк.

Лучший способ - использовать технологию LOAD DATA INFILE в MySQL.

например:

String path = "o.csv";
                String esquel = " LOAD DATA LOCAL INFILE " + path +
                            " INTO TABLE mytable" +
                            " LINES TERMINATED BY \'\\n\'";

statement.executeUpdate(esquel);

Перепишите запрос правильно для вашего требования. Это делает прямую загрузку вместо использования JAVA JDBC API для вставки.

Другие вопросы по тегам