2010-12-02 4 views
0

2つのテーブルへのデータの挿入を処理するプロシージャを記述します。いずれかで挿入が失敗する場合は、プロシージャ全体が失敗するはずです。私はこれをさまざまな方法で試してみましたが、それを働かせることはできません。意図的に2番目の挿入に失敗しましたが、データは最初のテーブルに挿入されます。row_countを使用するプロシージャの例を探す

私は、行カウントに基づいてIFステートメントをネストしようとしましたが、データが2番目の挿入に失敗しても、データは最初のテーブルに挿入されたままです。私は影響を受けた2行の合計数を探しています。

誰かが複数の挿入を処理する方法と、それらのいずれかが失敗した場合のロールバックを教えてもらえますか?短い例が良いでしょう。

答えて

0

InnoDBテーブル(または他の互換性のあるエンジン)を使用している場合は、MySQLのTransaction機能を使用して、必要なものを正確に実行することができます。

  • 基本的には、トランザクション
  • は、すべての結果がOKであれば、あなたがトランザクション内ですべてのクエリを無効にするためにROLLBACKを呼び出して、他の
  • CONMITを呼び出した結果
  • をチェックするクエリを実行し始めます。

hereを読んで記事を読むことができます。

HTH!

+0

:自動的にあなたが明示的に開始されていたトランザクションをコミットしていなくても、あなたの最初のインサートを犯す可能性があります既に取引を使用しています。問題は、最初の挿入でrow_countが1を返し、2番目の挿入で-1と仮定していることです。トランザクションが開始されても、2番目の挿入が失敗した場合でも、データは最初のテーブルに挿入されます。私はすでに影響を受ける行をテストしています。 – jim

+0

そして、innoDBテーブルでのトランザクションの使用は、最初のクエリをロールバックしていませんか? – SubniC

+0

SubniCはありません。それは変です。私はちょうどサイトの別の部分で作業中に今夜それに気付いた。私はInnodbを使用しています。どのようなアイデアかもしれない? – jim

0

自動コミットをオフにすることができます。私は私のポストでそれを言及している必要がありますが、私は誰もが私がしたことを知っているであろうことを前提に作られた

SET autocommit = 0; START TRANSACTION ......