Оператор INSERT
искажен. Ключевое слово: VALUES
, а не VALUE
.
Это может быть легко отлажено путем вывода текста SQL и передачи его другому клиенту.
Слишком много работы делается в одной строке; и выполняемая работа является сломанной , поскольку она уязвима для SQL-инъекций.
Здесь нет необходимости использовать конкатенацию строк для динамической подготовки текста SQL. И нет необходимости многократно отрабатывать создание и воссоздание sql и оператора ...
String sql = "INSERT INTO `kanat`(Number1) VALUES ( ? )";
PreparedStatement ps = null;
try {
ps = con.prepareStatement(sql);
while( ... ) {
String numberOfLine = ...
ps.setString(1, numberOfLine);
ps.executeUpdate();
}
} catch (SQLException e ) {
e.printStackTrace();
} finally {
if (ps != null) {
ps.close();
}
}
Followup
Если цель состоит в том, чтобы просто загрузить новые строки в таблицу, читая один «столбец» из файла .txt с разделителями-пробелами, лично я бы не возился с написанием неэффективного кода Java и обработкой RBAR (строки путем агонизирующей строки).
Я бы просто использовал встроенный оператор MySQL LOAD DATA
и взорвал весь файл за одну транзакцию.
Примерно так:
LOAD DATA LOCAL INFILE "/tmp/myfile.txt"
INTO TABLE mytable
FIELDS TERMINATED BY ' '
LINES TERMINATED BY '\n'
IGNORE 1 LINES
( @d1
, @d2
, @d3
, @d4
, @d5
, @d5
, @d6
)
SET mycol = TRIM(BOTH FROM @d4)
;
Если это необычно большой файл, который мне нужно загрузить, так как я не хочу, чтобы транзакции "Hugh Jass" выдували системное табличное пространство innodb (пространство, которое я не могу вернуть), я бы либо разделил файл ( OS split
команда), или мужской набор инструментов Percona pt-fifo-split
, чтобы разбить файл на трубу на лету.