跳至主要內容

MySQL 常见问题

码匠君SASSpring Authorization ServerDante Cloud微服务领域驱动DDDSpring BootSpring CloudSpring SecuritySpring Cloud AlibabaSpring Cloud TencentOAuth2.1NacosSkywalkingSentinelSeata大约 2 分钟

MySQL 常见问题

[1]java.sql.SQLSyntaxErrorException: Duplicate key name 'xxx_idx'

Dante Cloud 默认使用Spring Data JPA进行基础功能的编写, 采用 HibernateJPA的一种实现)提供的 ddl-auto进行基础表的创建和更新。

提示

什么是 Spring Data JPA, 参见:基础知识章节,Spring Data JPA

ddl-auto 怎么用,参见:更换数据库章节,spring-boot-starter-data-jpa 更换数据库方式

Hibernate 方言

Hibernate 底层依然使用SQL语句来执行数据库操作,虽然所有关系型数据库都支持使用标准 SQL 语句,但所有数据库都对标准 SQL 进行了一些扩展,所以在语法细节上存在一些差异,因此 Hibernate 需要根据数据库来识别这些差异。假如系统需要数据库的变换时,那么用 hibernate 的话就只需要改一改配置文件(修改连接字符串,驱动类,方言等),而用传统的jdbc时,那么SQL语言可能就要有很多改动。(略微重复了)

Hibernate 方言为实现HQL语句向不同数据库的 SQL 语句转换时,解决不同数据库之间的差异而制定的一套”规范”。

举例来说,我们在MySQL数据库里进行分页查询,只需使用limit关键字就可以了;而标准 SQL 并不支持limit关键字,例如 Oracle 则需要使用行内视图的方式来进行分页。同样的应用程序,当我们在不同数据库之间迁移时,底层数据库的访问细节会发生改变,而 Hibernate 也为这种改变做好了准备,现在我们需要做的是:告诉 Hibernate 应用程序的底层即将使用哪种数据库——这就是 Hibernate 方言。

说明

因为不同数据库自身的特殊性,那么不同数据库方言的实现逻辑也不能完全相同。出现这个问题是因为 MySQL 方言自身所导致,如果已经存在外键,那么就会抛出错误,但是不会影响实际使用。PostgreSQL 方案就不会出现问题。

解决的办法是:

在使用 MySQL 数据库时,在首次进行数据库表创建时,需要将dante-cloud-environment.yaml配置中的herodotus.switch.database.ddl-auto修改为create。当所有的表创建成功后,将herodotus.switch.database.ddl-auto值修改为none。那么在次启动就不会出现这个问题。