MyBatis выполняет несколько SQL-операторов за один раз, это возможно? - PullRequest
17 голосов
/ 24 августа 2011

Мне было интересно, возможно ли выполнить несколько SQL-операторов за один раз. Например, сценарий, в котором я хочу удалить строки из нескольких таблиц, есть ли способ сделать что-то вроде ..

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

Ответы [ 3 ]

22 голосов
/ 01 декабря 2011

Я использую myBatis с Oracle.Я думаю, что есть что-то подобное в другой БД.На самом деле вы всегда можете создавать процедуры в БД, что обычно лучше для будущего, когда вам нужно поддерживать проект.

<delete id="deleteUnfinishedData" parameterType="map">
    {call
        declare
        begin
            delete from TABLE1 where id = #{valueFromMap1};
            delete from TABLE2 where id = #{valueFromMap2};
        end
    }
</delete>
15 голосов
/ 18 октября 2011

Да, большинство баз данных позволяют это. Обычно вы должны разделять ваши операторы SQL чем-то. В PostGRES и MySQL это точка с запятой (;). На сервере Microsoft SQL вы должны использовать ключевое слово GO. [Обновление от 2013 года: начиная с 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!

0 голосов
/ 15 марта 2019

если кто-то получил ошибку типа

Причина: java.sql.SQLSyntaxErrorException: у вас есть ошибка в вашем SQL синтаксис; проверьте руководство, которое соответствует вашему серверу MariaDB версия для правильного синтаксиса для использования рядом с 'ОБНОВЛЕНИЕ mytable

Вы можете исправить это, разрешив несколько запросов в вашем драйвере. Для mariadb это было бы так же, как MySQL

allowMultiQuery = истина

описано в следующей проблеме mybatis https://github.com/mybatis/mybatis-3/issues/1497

...