【问题标题】:H2 Schema initailization. Syntax error in SQL statementH2 模式初始化。 SQL 语句中的语法错误
【发布时间】:2017-10-31 05:22:37
【问题描述】:

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

【问题讨论】:

    标签: spring-boot h2


    【解决方案1】:

    你设置了自动递增id,所以你不能插入带有id的新记录。

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

    【讨论】:

      【解决方案2】:

      在我的情况下,帮助我从插入查询中的表名中删除单引号

      我不得不改变这个:

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

      到这里:

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

      【讨论】:

        【解决方案3】:

        此错误是由 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 声明,请务必检查最后一列声明后的额外逗号

        【讨论】:

          【解决方案4】:

          试试这个,因为你用过Table_name

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 2015-06-19
              • 2013-06-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多