MySQL 常见问题
[1]java.sql.SQLSyntaxErrorException: Duplicate key name 'xxx_idx'
Dante Cloud
默认使用Spring Data JPA
进行基础功能的编写, 采用 Hibernate
(JPA
的一种实现)提供的 ddl-auto
进行基础表的创建和更新。
提示
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
。那么在次启动就不会出现这个问题。