我想知道是否有可能在1 go中执行多个sql语句。例如,我想从多个表中删除行的场景,有没有办法可以做的事情,比如...
<delete id="delete" parameterType="String">
DELETE FROM DUMMYTABLE_A where X=${value}
DELETE FROM DUMMYTABLE_B where X=${value}
</delete>
是的,大多数数据库允许这样做通常,您必须使用某些内容来划分SQL语句。在PostGRES和MySQL中,它是一个分号(;)。在Microsoft SQL Server中,您应该使用关键字GO。 [2013年5月更新:从SQL Server 2012开始,您可以并且应该使用分号来分隔您的语句。在SQL Server 2012(即下一个版本及更高版本)之后,这些将是强制性的。使用GO现在是在SQL2012及更高版本中不常用的方法。 ]
MySQL / PostGRES示例:
DELETE FROM DUMMYTABLE_A where X=${value};
DELETE FROM DUMMYTABLE_B where X=${value};
DELETE FROM DUMMYTABLE_C where X=${value};
MS-SQL示例:
DELETE FROM DUMMYTABLE_A where X=${value}
GO
DELETE FROM DUMMYTABLE_B where X=${value}
GO
DELETE FROM DUMMYTABLE_C where X=${value}
更好的数据库(即非MySQL)也将支持与BEGIN TRAN / COMMIT TRAN / ROLLBACK TRAN的交易。使用事务,您实际上可以将所有语句批量处理为一个原子操作,如果其中一部分失败,则所有三个都将被回滚。有关这些的更多信息,请参阅http://www.sqlteam.com/article/introduction-to-transactions。
您最需要的只是SQL语句之间的分号!
我正在使用myBatis和Oracle。我猜其他数据库中有类似的东西。实际上,当你必须支持项目时,你总是可以在DB中创建程序,这通常对未来更好。
<delete id="deleteUnfinishedData" parameterType="map">
{call
declare
begin
delete from TABLE1 where id = #{valueFromMap1};
delete from TABLE2 where id = #{valueFromMap2};
end
}
</delete>
如果有人得到像这样的错误
原因:java.sql.SQLSyntaxErrorException:您的SQL语法中有错误;检查与您的MariaDB服务器版本对应的手册,以便在'UPDATE mytable附近使用正确的语法
您可以通过在驱动程序中允许多个查询来解决此问题。对于mariadb,它将与MySQL相同
allowMultiQuery =真
在下面mybatis问题https://github.com/mybatis/mybatis-3/issues/1497中描述