如何使用Java(JDBC,MySQL)使用DATETIME DEFAULT创建表

时间:2014-04-28 19:55:20

标签: mysql jdbc

我有一些重新创建数据库所需的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;

这里有什么问题?

1 个答案:

答案 0 :(得分:-1)

我继承了一个MySQL数据库的Java测试工具,该测试工具在定义为NOT NULL且没有默认定义的日期时间列上发生此错误时失败。我添加了DEFAULT NOW(),之后它运行良好。