我有一个play框架2.2.2Scala应用程序,并使用play-flyway 1.0.3。
下列迁移应由天桥运行:
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语句编程填充它。
第一行执行得很好,但是更新状态器失败了。
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看起来就像
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
可能是某种超时问题。使它执行得更快(只更新一些行)
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;正确运行,也在天桥上。
发布于 2014-04-12 14:13:43
MySQL文档说,从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) ;https://stackoverflow.com/questions/23025532
复制相似问题