org.h2.jdbc.JdbcSQLSyntaxErrorException: SQL 语句中的语法错误“如果存在则删除表 [*]user CASCADE”;预期的“标识符”;SQL语句:

Raj*_*jan 11 sql h2

我的src/main/resources/data.sql文件中有以下 data.sql 文件。我希望从 user.csv 文件创建用户表。

DROP TABLE IF EXISTS `USER` CASCADE;
CREATE TABLE `user` AS SELECT * FROM CSVREAD('classpath:user.csv');
Run Code Online (Sandbox Code Playgroud)

当 spring 应用程序启动时,它总是出错并出现以下错误 -

引起原因:org.h2.jdbc.JdbcSQLSyntaxErrorException:SQL 语句“drop table ifexists [*]user CASCADE”中存在语法错误;预期的“标识符”;SQL语句:

我花了很长时间来找出错误,但无法解决。知道如何修复此错误吗?

lu_*_*_ko 22

新版本的H2数据库中有一个关键字USER,因此需要正确转义。您应该使用双引号"而不是单引号'

从H2 文档复制/粘贴:

有一系列关键字不能用作标识符(表名、列名等),除非它们被引号引起来(用双引号括起来)。以下标记是 H2 中的关键字:

...、用户、...

新版本的 H2 可能比旧版本有更多的关键字。


小智 7

请务必检查您是否能够通过 pgadmin 或 toad 等 DBMS 工具在您使用的数据库上运行相同的查询。我假设你正在使用 postgresql,所以如果你仍然使用 user 关键字,则保留它。需要创建名为 user 的表,它必须用双引号括起来,也许您可​​以尝试在 Java 中使用双引号而不是单引号,您将需要转义此双引号以包含在此查询文本的字符串文本中

DROP TABLE IF EXISTS "USER" CASCADE;
CREATE TABLE "user" AS SELECT * FROM CSVREAD('classpath:user.csv')

Run Code Online (Sandbox Code Playgroud)