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

Oracle で myBatis を使用しています。他のDBにも似たようなものがあると思います。実際には、プロジェクトをサポートする必要がある場合は、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 サーバーでは、キーワード 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 によるトランザクションもサポートします。トランザクションを使用すると、実際にすべてのステートメントを 1 つのアトミック操作にバッチ処理できます。その一部が失敗した場合、3 つすべてがロールバックされます。それらの詳細については、http://www.sqlteam.com/article/introduction-to-transactionsを参照してください。

ほとんどの場合、必要なのは SQL ステートメント間のセミコロンだけです!

于 2011-10-18T05:52:54.773 に答える