Загрузить 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
- Делать
id
поле AUTO_INCREMENT. - Установите значения по умолчанию для других полей.
- Используйте 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 для вставки.