Flyway 和 MariaDB:SQLException 外键约束的格式不正确

Posted

技术标签:

【中文标题】Flyway 和 MariaDB:SQLException 外键约束的格式不正确【英文标题】:Flyway & MariaDB: SQLException Foreign key constraint is incorrectly formed 【发布时间】:2019-11-05 16:52:56 【问题描述】:

我目前正在尝试从 Hibernate 生成我的 ddl 方案切换到 Flyway 迁移。我生成了我的 V1__Initial.sql 脚本by this means。当我在内存 H2 数据库上运行它时,一切正常。但是当我尝试在 MariaDB 上运行它时,出现以下异常:

Migration V1__Initial.sql failed
--------------------------------
SQL State  : HY000
Error Code : 1005
Message    : (conn=130) Can't create table `booking`.`booking_cancelled_event` (errno: 150 "Foreign key constraint is incorrectly formed")
Location   : db/migration/V1__Initial.sql (C:\code\ajt\backend\target\classes\db\migration\V1__Initial.sql)
Line       : 463
Statement  : alter table booking_cancelled_event
   add constraint FKnxiyj0m730pl9ol2y4qng7577
   foreign key (cancelled_booking_id)
   references cancelled_internal_booking

来自V1__Initial.sql的对应部分:

alter table booking_cancelled_event
   add constraint FKnxiyj0m730pl9ol2y4qng7577
   foreign key (cancelled_booking_id)
   references cancelled_internal_booking;

SHOW ENGINE InnoDB STATUS; 的输出:

------------------------
LATEST FOREIGN KEY ERROR
------------------------
2019-06-23 21:07:30 0x1974 Error in foreign key constraint of table `xxx`.`booking_cancelled_event`:
Alter  table `booking`.`booking_cancelled_event` with foreign key constraint failed. Parse error in '
   foreign key (cancelled_booking_id)
   references cancelled_internal_booking' near '
   references cancelled_internal_booking'.

版本:

MariaDB 10.4

Spring Boot 2.1.5.RELEASE

航路 5.2.4

【问题讨论】:

要么以正确的顺序运行 CREATE TABLE 语句(对于 FK),要么禁用,然后重新启用 FK。 @RickJames scipt 的执行顺序与脚本中写入的顺序不同吗?第一个语句是创建表的语句,外键稍后定义! 【参考方案1】:

根据 MariaDB 文档的 ALTER TABLE 页面,ADD CONSTRAINT 的语法应该是:

ADD [CONSTRAINT [symbol]]
    FOREIGN KEY [IF NOT EXISTS] [index_name] (index_col_name,...)
    reference_definition

根据 MariaDB 文档的CREATE TABLE 页面,reference_definition 的语法应该是:

REFERENCES tbl_name (index_col_name,...)
  [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
  [ON DELETE reference_option]
  [ON UPDATE reference_option]

所以您遇到的解析错误很可能是因为您在cancelled_internal_booking 表名之后错过了(index_col_name,...)

【讨论】:

我犯的错误是针对内存中的 H2 运行 jpa ddl 创建,然后我尝试将 Flyway 脚本中的命令应用于 MaraiDB。

以上是关于Flyway 和 MariaDB:SQLException 外键约束的格式不正确的主要内容,如果未能解决你的问题,请参考以下文章

使用 Docker 和 Jenkins 自动化 Flyway 迁移

Docker Flyway MySQL 8:客户端不支持服务器请求的身份验证协议。考虑升级 MariaDB 客户端

Flyway和liquibase在一起? [关闭]

Flyway详解以及Springboot集成Flyway(转)

flyway - 校验和概念的含义

Flyway 和 Spring Boot 集成