在Spring Boot中加载schema.sql文件时出现SQL语法错误

时间:2018-04-29 00:44:01

标签: java spring-boot h2

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

理想情况下,我只想让表格自动生成。我已在application.properties中停用了自动ddl设置。但是,我收到了错误:

错误:

  

引起:org.springframework.beans.factory.BeanCreationException:创建名称为' dataSource'的bean时出错在类路径资源中定义[org / springframework / boot / autoconfigure / jdbc / DataSourceConfiguration $ Hikari.class]: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/Habicus-Core/build/resources/main/schema.sql]的SQL脚本语句#1: CREATE TABLE goal_metrics(;嵌套异常是org.h2.jdbc.JdbcSQLException:SQL语句中的语法错误" CREATE TABLE"" GOAL_METRICS""([* ]&#34 ;;期望"标识符&#34 ;; SQL语句:

schema.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;

1 个答案:

答案 0 :(得分:0)

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

  • 内存
  • 选择
  • 授权

...等等...

由于我使用的是Spring JPA存储库,因此我通过重命名域对象(并确保所有名称都不匹配保留的h2db名称)解决了该问题。

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