org.h2.jdbc.JdbcSQLSyntaxErrorException: SQL 语句 "drop table if exists [*]user CASCADE " 中的语法错误;预期 "identifier"; SQL声明:

org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "drop table if exists [*]user CASCADE "; expected "identifier"; SQL statement:

我的 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');

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

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "drop table if exists [*]user CASCADE "; expected "identifier"; SQL statement:

我花了很长时间才找出错误,但没能成功。知道如何修复此错误吗?

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

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

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

Copy/paste 来自 H2 documentation:

There is a list of keywords that can't be used as identifiers (table names, column names and so on), unless they are quoted (surrounded with double quotes). The following tokens are keywords in H2:

..., USER, ...

Newer versions of H2 may have more keywords than older ones.