Spring Boot H2架构初始化,SQL语句中存在语法错误

zu0ti5jz  于 2022-11-05  发布在  Spring
关注(0)|答案(7)|浏览(179)

我有一个Spring Boot 应用程序,我试图在应用程序启动时初始化一些数据。
这是我的应用程序属性:


# Database connection

spring.datasource.url=jdbc:h2:mem:test_db
spring.datasource.username=...
spring.datasource.password=...
spring.datasource.driverClassName=org.h2.Driver

spring.datasource.initialize=true
spring.datasource.schema=schema.sql
spring.datasource.data=schema.sql

# Hibernate configuration

# spring.jpa.hibernate.ddl-auto = none

这是schema.sql:

CREATE TABLE IF NOT EXISTS `Person` (
  `id`         INTEGER  PRIMARY KEY AUTO_INCREMENT,
  `first_name` VARCHAR(50) NOT NULL,
  `age`        INTEGER  NOT NULL,
  PRIMARY KEY(`id`)
);

和data.sql

INSERT INTO `Person` (
  `id`,
  `first_name`,
  `age`
) VALUES (
  1,
  'John',
  20
);

但在应用程序启动时出现“SQL语句中的语法错误”:

19:08:45.642 6474 [main] INFO  o.h.tool.hbm2ddl.SchemaExport - HHH000476: Executing import script '/import.sql'
19:08:45.643 6475 [main] ERROR o.h.tool.hbm2ddl.SchemaExport - HHH000388: Unsuccessful: CREATE TABLE Person (
19:08:45.643 6475 [main] ERROR o.h.tool.hbm2ddl.SchemaExport - Syntax error in SQL statement "CREATE TABLE PERSON ( [*]"; expected "identifier"
Syntax error in SQL statement "CREATE TABLE PERSON ( [*]"; expected "identifier"; SQL statement:

我不明白,这个SQL有什么问题。

p8h8hvxi

p8h8hvxi1#

请尝试以下代码。删除PRIMARY KEY( id )并执行它。

CREATE TABLE IF NOT EXISTS `Person` (
    `id`         INTEGER  PRIMARY KEY AUTO_INCREMENT,
     `first_name` VARCHAR(50) NOT NULL,
     `age`        INTEGER  NOT NULL
);
6tr1vspr

6tr1vspr2#

这个错误是由CREATE TABLE宣告的结构所造成。
当您在SQL宣告的结尾有多馀的逗号--逗号后面没有数据行宣告时,就会产生这个结果。例如:

CREATE TABLE IF NOT EXISTS `Person` (
  `id`         INTEGER  PRIMARY KEY AUTO_INCREMENT,
  `first_name` VARCHAR(50) NOT NULL,
  `age`        INTEGER  NOT NULL,     --note this line has a comma in the end
);

这是因为CREATE TABLE需要与表沿着创建的列的列表,并且列的第一个参数是identifier。当您检查here时,列声明遵循以下结构:

identifier datatype <constraints> <autoincrement> <functions>

因此,在您的例子中,正如@budthapa和@Vishwanath Mataphati所提到的,您可以简单地从CREATE TABLE声明中删除PRIMARY KEY(id)行。此外,您已经在列定义的第一行中声明了id是主键
如果没有语句作为PRIMARY KEY声明,请确保检查最后一个列声明后是否有多余的逗号

rkue9o1l

rkue9o1l3#

请尝试此操作,因为您已经使用了**Table_name**

CREATE TABLE IF NOT EXISTS Person (
    id        INTEGER  PRIMARY KEY AUTO_INCREMENT,
     first_name VARCHAR(50) NOT NULL,
     age        INTEGER  NOT NULL
);
7gyucuyw

7gyucuyw4#

在我的例子中,从插入查询的表名中删除单引号是有帮助的
我不得不改变这一点:

INSERT INTO 'translator' (name, email) VALUES ('John Smith', 'john@mail.com');

更改为:

INSERT INTO translator (name, email) VALUES ('John Smith', 'john@mail.com');
b5buobof

b5buobof5#

您设置了自动递增ID,因此无法插入具有该ID的新记录。

Try INSERT INTO `Person` (
  `first_name`,
  `age`
) VALUES (
  'John',
  20
);
u91tlkcl

u91tlkcl6#

我遇到了同样的问题。我用这些application.properties修复了这个问题:

spring.jpa.properties.hibernate.connection.charSet=UTF-8
spring.jpa.properties.hibernate.hbm2ddl.import_files_sql_extractor=org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor

多行和默认编码存在一些问题。

gt0wga4j

gt0wga4j7#

我在下面添加到application.properties,它对我很有效
jpa.属性.休眠.全局引用标识符= true

相关问题