H2 Schema初始化。 SQL语句中的语法错误

时间:2017-05-30 16:16:12

标签: spring-boot h2

我有一个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有什么问题。

5 个答案:

答案 0 :(得分:6)

试试这段代码。删除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
);

答案 1 :(得分:1)

尝试此操作,因为您已经使用过 Table_name

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

答案 2 :(得分:1)

此错误是由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所提到的,您可以简单地从PRIMARY KEY(id)声明中删除CREATE TABLE行。此外,您已经在列定义的第一行指出id是主键

如果没有声明作为PRIMARY KEY声明,请确保在最后一个列声明之后检查是否有多余的逗号

答案 3 :(得分:0)

使用另一个com.h2database版本。例如:1.4.199

答案 4 :(得分:0)

对我的情况有帮助的是从插入查询中的表名中删除单引号

我不得不改变这个:

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

为此:

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