MySQL 8.0.29 JDBC执行删表重建语句报SQL语法错误
报错原因
- 核心触发点:JDBC驱动默认不支持单次调用执行多条分号分隔的SQL语句。你将删表、建表两条SQL拼接为一个字符串传入
executeUpdate,驱动会将整段文本作为单条SQL解析,遇到分号后的CREATE TABLE关键字时无法识别语法,直接抛出你看到的错误。 - 隐藏语法问题:建表语句中使用的
long是Java语言的类型名,不是MySQL的合法字段类型,MySQL中对应64位整数的类型为BIGINT,就算解决多语句执行问题,这里也会触发类型错误。
修复方案
- 拆分SQL语句,分开调用
executeUpdate执行删表、建表逻辑,不要在一次方法调用里传入多条分号分隔的SQL。 - 修正建表语句的字段类型,将
long替换为MySQL支持的BIGINT。 - 做规范兼容:INSERT语句补全
INTO关键字,符合标准SQL写法,避免不同环境下的兼容问题。
修复后的可运行代码如下:
public static void main(String[] args) throws SQLException { try (Connection connection = Util.getConnection()) { Statement statement = connection.createStatement(); // 单独执行删表逻辑 statement.executeUpdate("DROP TABLE IF EXISTS `users`"); // 单独执行建表逻辑,修正字段类型 statement.executeUpdate("CREATE TABLE `users` (" + "Id BIGINT," + "name varchar(100)," + "lastName varchar(100)," + "age tinyint" + ")"); System.out.println("table created"); // 补全INTO关键字执行插入 int rows = statement.executeUpdate("INSERT INTO users(Id,name,lastName,age) VALUES (101,'Mike','Manson',31)"); } }
补充说明:如果确实有场景需要一次性执行多条SQL,可以在JDBC连接URL后追加参数
allowMultiQueries=true开启多语句支持,但这种方式会放大SQL注入风险,业务代码中不推荐使用。
内容的提问来源于stack exchange,提问作者Kristina
相关产品推荐
相关产品推荐

