首页 > 解决方案 > 在 Spring Boot 中加载 schema.sql 文件时出现 SQL 语法错误

问题描述

我有一个非常基本的 schema.sql 文件:

理想情况下,我只希望表格自动生成。我已经禁用了我的application.properties. 但是,我收到错误:

错误:

原因:org.springframework.beans.factory.BeanCreationException:在类路径资源[org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]中定义名称为“dataSource”的bean创建错误:bean初始化失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:创建名为 'org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker' 的 bean 时出错:调用 init 方法失败;嵌套异常是 org.springframework.jdbc.datasource.init.ScriptStatementFailedException:无法执行 URL [file:/Users/schachte/Documents/Habcus-Core/build/resources/main/schema.sql] 的 SQL 脚本语句 #1:创建表goal_metrics(; 嵌套异常是 org.h2.jdbc.JdbcSQLException: SQL 语句中的语法错误 "CREATE TABLE ""GOAL_METRICS"" ( [*]"; 预期的 "identifier"; SQL 语句:

架构.SQL

CREATE TABLE `goal_metrics` (
  `goal_metrics_id` int(11) NOT NULL,
  `goal_complete` varchar(45) DEFAULT NULL,
  `goal_in_progress` varchar(45) DEFAULT NULL,
  `money_made_on_goal` varchar(45) DEFAULT NULL,
  `time_until_due_date` decimal(10,0) DEFAULT NULL,
  `goals_goal_id` int(11) NOT NULL,
  PRIMARY KEY (`goal_metrics_id`,`goals_goal_id`),
  KEY `fk_goal_metrics_goals1_idx` (`goals_goal_id`),
  CONSTRAINT `fk_goal_metrics_goals1` FOREIGN KEY (`goals_goal_id`) REFERENCES `goals` (`goal_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `metrics` (
  `goalsInProgress` int(11) NOT NULL,
  PRIMARY KEY (`goalsInProgress`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `users` (
  `user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(45) DEFAULT NULL,
  `password` varchar(45) DEFAULT NULL,
  `email` varchar(255) NOT NULL,
  `dob` datetime DEFAULT NULL,
  `gender` varchar(25) DEFAULT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `email_UNIQUE` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

标签: javaspring-booth2

解决方案


我遇到了同样的问题,只是意识到当你使用reserved words时 h2db 不喜欢它。不要使用保留字命名您的数据库或表甚至字段,例如:

  • 团体
  • 记忆
  • 选择
  • 授权

...ETC...

我通过重命名我的域对象来解决它(并确保没有名称与保留的 h2db 名称匹配),因为我使用的是 Spring JPA,存储库。

大多数人犯的一个常见错误是在 H2DB 上使用 MySql 语法。也不要犯这个错误。H2 数据库有自己的语法。


推荐阅读