首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FlywayDB:使用“错误执行语句”迁移失败,但手动运行迁移SQL代码有效。

FlywayDB:使用“错误执行语句”迁移失败,但手动运行迁移SQL代码有效。
EN

Stack Overflow用户
提问于 2014-04-12 02:55:10
回答 1查看 2.4K关注 0票数 2

我有一个play框架2.2.2Scala应用程序,并使用play-flyway 1.0.3。

下列迁移应由天桥运行:

代码语言:javascript
复制
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) ;

因此,我将一列添加到表中,然后使用update语句编程填充它。

第一行执行得很好,但是更新状态器失败了。

代码语言:javascript
复制
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)

但是,当我使用phpmyadmin迁移SQL代码并运行它时,它工作得很好(尽管运行时间为2-5秒,但表相当大)。

我的mysql.log看起来就像

代码语言:javascript
复制
                  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

天桥是不是有某种超时时间?日志文件显示它将查询发送到mysql服务器,然后回滚。为什么?如前所述,查询是正确的。当我手动运行它时它就能工作了。

编辑

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

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

edit2

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

代码语言:javascript
复制
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;

正确运行,也在天桥上。

EN

回答 1

Stack Overflow用户

发布于 2014-04-12 14:13:43

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

注意,在问题中显示的日志中,autocommit是禁用的。当然,可以在以下语句之间使用显式COMMIT

代码语言:javascript
复制
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:

代码语言:javascript
复制
ALTER TABLE  `user_visits` ADD  `FirstSiteRequestTime` DATETIME NOT NULL ;

文件V2__update_table.sql:

代码语言:javascript
复制
UPDATE `user_visits` SET `FirstSiteRequestTime`=(SELECT `Time` FROM `user_siterequests` WHERE `user_siterequests`.`Visit`=`user_visits`.`ID` ORDER BY `Time` ASC LIMIT 1) ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23025532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档