18

我想知道是否可以一次执行多个 sql 语句。例如,我想从多个表中删除行的场景,有没有办法可以做类似的事情。

<delete id="delete" parameterType="String">
    DELETE FROM DUMMYTABLE_A where X=${value}
    DELETE FROM DUMMYTABLE_B where X=${value}
</delete>
4

3 回答 3

25

我将 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>
于 2011-12-01T09:01:56.203 回答
18

是的,大多数数据库都允许这样做。通常你必须用一些东西来界定你的 SQL 语句。在 PostGRES 和 MySQL 中,它是一个分号 (;)。在 Microsoft SQL Server 中,您应该使用关键字 GO。[ 2013 年 5 月更新:从 SQL Server 2012 开始,您可以并且应该使用分号来分隔语句。在 SQL Server 2012(即下一版本及更高版本)之后,这些将是强制性的。在 SQL2012 及以后的版本中,使用 GO 现在已被弃用)。]

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 语句之间的分号!

于 2011-10-18T05:52:54.773 回答
1

如果有人遇到类似的错误

原因:java.sql.SQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以获取在“UPDATE mytable”附近使用的正确语法

您可以通过在驱动程序中允许多个查询来解决此问题。对于 mariadb,它将与 MySQL 相同

allowMultiQuery=true

在以下 mybatis 问题中描述 https://github.com/mybatis/mybatis-3/issues/1497

于 2019-03-15T05:00:58.550 回答