java - 在 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;
解决方案
我遇到了同样的问题,只是意识到当你使用reserved words时 h2db 不喜欢它。不要使用保留字命名您的数据库或表甚至字段,例如:
- 团体
- 记忆
- 选择
- 授权
...ETC...
我通过重命名我的域对象来解决它(并确保没有名称与保留的 h2db 名称匹配),因为我使用的是 Spring JPA,存储库。
大多数人犯的一个常见错误是在 H2DB 上使用 MySql 语法。也不要犯这个错误。H2 数据库有自己的语法。
推荐阅读
- rest - Informatica BDM - 如何重试“REST Web 服务使用者”?
- javascript - 如何将逻辑语句引入 XML 视图或如何更改某些 Table 项目的展示方式
- r - Anova not working at multilevel analysis - "$ operator not defined for this S4 class"
- prometheus - Prometheus 同时监听不同的端口
- angular - 自动调整 textarea 最大 5 行限制,然后显示滚动条
- java - 如何仅使用 java 使用特殊字符(包括空格)创建大小为 5 的非重复随机字符串?
- kubernetes - Helm V3 - 找不到官方仓库
- python - 生成具有 60% 0 和 40% 1 的虚拟数据
- android - Android - 当应用程序移至后台并置于前台时,不维护后台堆栈
- r - 如何从 R 中的两个堆叠的 transitionLayers 中选择每个位置的最大值?