我有一些重新创建数据库所需的MySQL脚本。当我使用mysql
命令在命令行上执行它们时,它们工作正常。
现在我编写了一个Java类,它应该使用与MySQL数据库的JDBC连接来执行这些脚本。
脚本中"创建表" -statement中的一行是:
registration_date DATETIME DEFAULT CURRENT_TIMESTAMP
然而,这条线路不会使用JDBC-MySQL连接执行。我收到错误:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Invalid default value for 'registration_date'
相关方法如下所示。 sqlScriptPath
指向包含sql脚本的文件夹。 connectionString具有以下内容:"jdbc:mysql://localhost:3306/testDb?useUnicode=yes&characterEncoding=UTF-8&allowMultiQueries=true"
public static void recreate(String connectionString, String dbUser, String dbPass, String sqlScriptPath) throws Exception {
// Find and filter sql scripts
File file = new File(sqlScriptPath);
File[] scripts = file.listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.getName().endsWith(".sql");
}
});
List<File> scriptsList = Arrays.asList(scripts);
Collections.sort(scriptsList);
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection conn = DriverManager.getConnection(connectionString, dbUser, dbPass);
// Load each script and apply it
for (File f : scriptsList) {
System.out.println("Importing script: " + f);
List<String> lines = Files.readAllLines(Paths.get(f.getAbsolutePath()), Charset.forName("UTF-8"));
StringBuilder sb = new StringBuilder();
for (String line : lines) sb.append(line).append("\n");
String sqlStatement = sb.toString();
System.out.print(sqlStatement);
Statement st = conn.createStatement();
st.execute(sqlStatement);
st.close();
}
}
脚本的相关部分:
CREATE TABLE user
(
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
username VARCHAR(255),
password VARCHAR(255),
age_group INT,
registration_date DATETIME DEFAULT CURRENT_TIMESTAMP
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8;
这里有什么问题?
答案 0 :(得分:-1)
我继承了一个MySQL数据库的Java测试工具,该测试工具在定义为NOT NULL且没有默认定义的日期时间列上发生此错误时失败。我添加了DEFAULT NOW(),之后它运行良好。