我有一个像这样的MySQL查询:
truncate table A;load data local infile '~/some.csv' into table A fields terminated by ',' OPTIONALLY ENCLOSED BY '\"' (COLUMN1,COLUMN2,COLUMN3)
当我在工作台中运行它但是当它由java app执行时,它运行得很好:
String qry = "truncate table A;load data local infile '~/some.csv' into table A fields terminated by ',' OPTIONALLY ENCLOSED BY '\"' (COLUMN1,COLUMN2,COLUMN3)";
Connection con = DriverManager.getConnection(HOST, USER, PASSWORD);
java.sql.Statement stmt = con.createStatement();
stmt.execute(qry);
我明白了:
您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在第1行的表A'中使用'load data local infile'〜/ some.csv'附近使用正确的语法
服务器上的版本是:MySQL 5.6.27
在我的本地计算机上它是:5.7.19,对于Linux(x86_64)
PS:我在workbench中运行的查询是我登录java应用程序的查询。
答案 0 :(得分:2)
正如现在删除的评论中所提到的,您的问题可能是尝试执行多个MySQL语句,而MySQL处于禁止多个语句的模式。一种解决方法是将连接URL更改为以下内容:
String dbUrl = "jdbc:mysql://localhost:3306/yourDB?allowMultiQueries=true";
以下是一段代码片段,展示了如何执行此操作:
public static void main (String[] args) {
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
String HOST = "jdbc:mysql://localhost:3306/yourDB?allowMultiQueries=true";
String qry = "truncate table A;load data local infile '~/some.csv' into table A fields terminated by ',' OPTIONALLY ENCLOSED BY '\"' (COLUMN1,COLUMN2,COLUMN3)";
Connection con = DriverManager.getConnection(HOST, USER, PASSWORD);
java.sql.Statement stmt = con.createStatement();
stmt.execute(qry);
}
catch (Exception e) {
System.out.println("failed");
e.printStackTrace(System.out);
}
这可能是最快的解决方法。如果没有,那么您可以考虑使用批处理,或者只是为截断和加载数据执行多个语句。基于@GaborSch下面的评论,执行单独的陈述可能是更安全的选择。
进一步阅读: