schema.sql 每当检查连接时运行

schema.sql runs whenever the connection is checked

我遇到了一个奇怪的问题。 我的 springboot 应用程序中有一个 schema.sql 文件,它创建表(具有外键约束)并在应用程序 运行 上插入数据。但是这里的问题是,当连接空闲时,连接就被测试了。现在,这给我带来了问题,因为 schema.sql 文件再次执行,并且如您所知我的表包含外键约束,因此脚本失败,因为它不允许删除包含外键约束的表。

是不是因为我的application.properties

这是我的application.properties

spring.datasource.url=jdbc:mysql://dummy_url
spring.datasource.username=root
spring.datasource.password=password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.initialization-mode=always
mybatis.config-location=classpath:/config/mybatis-config.xml

有什么方法可以让schema.sql只执行一次(只有当应用程序是运行时)? 我的样本 schema.sql 看起来是这样的:

DROP TABLE IF EXISTS `t001_map_mst`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `t001_map_mst` (
  `MAP_ID` int NOT NULL AUTO_INCREMENT,
  `MAP_NAME` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`MAP_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='Contains map info';
/*!40101 SET character_set_client = @saved_cs_client */;

因为您使用的是 spring.datasource.initialization-mode=always,所以此 属性 具有以下值:

ALWAYS Always initialize the data source.
EMBEDDED Only initialize an embedded data source.
NEVER Do not initialize the data source.
check official document

我提供三种解决问题的方法 1. 更改您的 schema.sql,如果 table 存在则不要 运行 脚本 2. 完成第一个 运行 后,将 application.properties 更改为 spring.datasource.initialization-mode=none
3. 从代码初始化:检查 Spring Boot - Loading Initial Data