You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java执行初始化SQL脚本报SQLSyntaxErrorException,MySQL工作台运行正常

问题分析

核心问题在于初始化数据库的逻辑顺序错误:连接URL中直接指定了testDB,若该数据库尚未创建,连接会直接失败;即使数据库已存在,脚本中重复执行USE testDB可能和多语句执行机制冲突,导致后续CREATE TABLE语句解析异常。

解决步骤

步骤1:修正数据库连接逻辑

连接时不要直接指定目标数据库,改为连接MySQL服务默认的mysql数据库(或不指定具体库),确保数据库未创建时也能成功建立连接:

private static void initConenction() throws SQLException{
    // 连接到MySQL服务,不指定具体数据库
    String url = "jdbc:mysql://localhost:3306/?allowMultiQueries=true";
    final String userName = "root";
    final String password = "mypassword";
    try {
        con = DriverManager.getConnection(url, userName, password);
        System.out.println("Connection established!");
    } catch (SQLException e) {
        e.printStackTrace();
        throw e;
    }
}

步骤2:调整SQL脚本执行逻辑(更稳妥的方式)

虽然开启了allowMultiQueries=true,但一次性执行多语句有时会因换行符、注释等问题导致解析错误。可以将SQL脚本按分号拆分,逐个执行:

private static void initDatabase() throws SQLException, IOException {
    try {
        Statement stmt = con.createStatement();
        String sqlStr = Files.readString(Paths.get("src/testdb.sql"));
        // 按分号拆分SQL语句,过滤空行和注释
        String[] sqlStatements = sqlStr.split(";");
        for (String sql : sqlStatements) {
            String trimmedSql = sql.trim();
            // 跳过空语句和注释行
            if (!trimmedSql.isEmpty() && !trimmedSql.startsWith("--")) {
                stmt.execute(trimmedSql);
            }
        }
        System.out.println("Database initialization completed!");
    } catch (IOException e) {
        System.out.format("I/O error: %s%n", e);
        throw e;
    } catch (SQLException e) {
        e.printStackTrace();
        throw e;
    }
}

步骤3:保留SQL脚本原样

你的testdb.sql脚本本身没有语法问题,无需调整:

CREATE DATABASE IF NOT EXISTS testDB;
USE testDB;

CREATE TABLE USERS(
    userType VARCHAR(50) not null,
    userName VARCHAR(100) not null,
    password VARCHAR(100) not null,
    primary key(userName)
);
额外注意事项
  • 确保MySQL用户root拥有创建数据库和表的权限;
  • 若使用MySQL 8.0+版本,需匹配对应版本的JDBC驱动(建议使用mysql-connector-java:8.0.33及以上);
  • 执行USE testDB后,后续表创建操作会自动在该库下执行,无需额外指定。

内容的提问来源于stack exchange,提问作者Gigi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:05:20