执行H2数据库脚本时遇org.h2.jdbc.JdbcSQLSyntaxErrorException错误求助
解决H2执行
LOCK TABLES语句的语法错误问题 你遇到的这个语法错误,核心原因很明确:H2数据库并不支持MySQL的LOCK TABLES命令——这条语句是MySQL独有的语法,H2没有实现对应的功能,所以执行时会直接抛出语法错误。
下面给你几个可行的解决方案:
方案1:直接移除LOCK TABLES语句(最推荐)
因为你使用的是H2内存数据库(jdbc:h2:mem:db1),这类场景大多用于测试,LOCK TABLES操作完全没有必要。直接删掉脚本里的最后一行:
LOCK TABLES `infrastructure_parameter` WRITE;
修改后的脚本就能正常在H2中执行了。
方案2:开启H2的MySQL兼容模式(保持脚本兼容性)
如果你的SQL脚本需要同时在MySQL和H2环境中运行,不想修改脚本内容,可以在H2的连接URL中添加MODE=MySQL参数,让H2模拟MySQL的语法行为(会忽略它不支持的LOCK TABLES语句,不会报错)。
修改后的执行命令如下:
java -cp h2-1.4.199.jar org.h2.tools.RunScript -url jdbc:h2:mem:db1;MODE=MySQL -script infra_params.sql
不过要注意:H2的兼容模式只是模拟语法,并不会真正执行锁表操作,这个方案只适合测试场景。
额外优化:移除MySQL特有的ENGINE=InnoDB
你的建表语句里的ENGINE=InnoDB也是MySQL专属配置,H2不需要这个参数,虽然兼容模式下会自动忽略,但为了脚本更通用,建议删掉这部分,修改后的建表语句:
CREATE TABLE `infrastructure_parameter` ( `id` varchar(36) NOT NULL, `created_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `modified_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `NAME` varchar(255) DEFAULT NULL, `PROPERTIES` varchar(255) DEFAULT NULL, `ready` tinyint(1) DEFAULT '0', `TYPE` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `UNQ_infrastructure_parameter_0` (`NAME`,`PROPERTIES`) ) DEFAULT CHARSET=UTF8;
内容的提问来源于stack exchange,提问作者UdhanIsuranga
相关产品推荐
相关产品推荐

