gpt4 book ai didi

mysql - FlywayDB : Migration fails with "Error executing statement", 但手动运行迁移 SQL 代码有效

转载 作者:行者123 更新时间:2023-11-29 03:35:13 27 4
gpt4 key购买 nike

我有一个 play framework 2.2.2 scala 应用程序并使用 play-flyway 1.0.3。

以下迁移应该由 flyway 运行:

ALTER TABLE  `user_visits` ADD  `FirstSiteRequestTime` DATETIME NOT NULL ;
UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1) ;

所以我向表中添加了一列,然后使用更新语句以编程方式填充它。

第一行执行正常,但更新状态失败

FlywaySqlScriptException: Error executing statement at line 2: UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1)
com.googlecode.flyway.core.command.FlywaySqlScriptException: Error executing statement at line 2: UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1)
com.googlecode.flyway.core.dbsupport.SqlScript.execute(SqlScript.java:92)
com.googlecode.flyway.core.resolver.sql.SqlMigrationExecutor.execute(SqlMigrationExecutor.java:72)
com.googlecode.flyway.core.command.DbMigrate$2.doInTransaction(DbMigrate.java:243)
com.googlecode.flyway.core.command.DbMigrate$2.doInTransaction(DbMigrate.java:241)
com.googlecode.flyway.core.util.jdbc.TransactionTemplate.execute(TransactionTemplate.java:72)

但是,当我获取迁移 SQL 代码并使用 phpmyadmin 运行它时,它工作正常(虽然运行需要 2-5 秒,但表非常大)。

我的 mysql.log 看起来像

                  128 Query SET autocommit=0
128 Query ALTER TABLE `user_visits` ADD `FirstSiteRequestTime` DATETIME NOT NULL
140412 4:40:43 128 Query UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1)
140412 4:40:44 128 Query rollback
128 Query SET autocommit=1

flyway 是否有某种超时?日志文件显示它将查询发送到 mysql 服务器,但随后回滚。为什么?如前所述,查询是正确的。当我手动运行它时它会起作用。

编辑:

运行迁移后,执行并提交了 ALTER TABLE 语句(表已更改),尽管 mysql.log 说它已回滚。第二条命令真的回滚了。

我还尝试在两个迁移中拆分两个 SQL 命令。然后第一个 (ALTER TABLE) 运行正常,第二个失败。

edit2:

这可能是某种超时问题。让它执行得更快(通过只更新一些行)

ALTER TABLE  `user_visits` ADD  `FirstSiteRequestTime` DATETIME NOT NULL ;
UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1) WHERE user_visits.id<1000;

正确运行,也在 flyway 中。

最佳答案

MySQL documentation表示从 MySQL 5.5.3 开始,在执行前导致隐式提交的“大多数语句”在执行后也会这样做。这似乎包括 ALTER TABLE 语句(在 MySQL 5.5.3 及更高版本中)。

请注意,在问题中显示的日志中,autocommit 已禁用。可以肯定的是,要么在语句之间使用显式 COMMIT,如下所示:

ALTER TABLE  `user_visits` ADD  `FirstSiteRequestTime` DATETIME NOT NULL ;
COMMIT ;
UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1) ;

或者将它们放在单独且连续的迁移文件中,如下所示:

文件 V1__alter_table.sql:

ALTER TABLE  `user_visits` ADD  `FirstSiteRequestTime` DATETIME NOT NULL ;

文件 V2__update_table.sql:

UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1) ;

关于mysql - FlywayDB : Migration fails with "Error executing statement", 但手动运行迁移 SQL 代码有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23025532/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com