ストアドプロシージャでトランザクション処理をするにはどうすれば良いのでしょうか?
複数のテーブルの行をストアドプロシージャで一括削除したいのですが、
エラーが発生した場合は、ロールバックしたいと思っています。
たとえば、
create table A (id INT, name VARCHAR(32)); // idと名前を持つテーブルA
create table B (id INT, address TINYTEXT); // idと住所を持つテーブルB
の二つのテーブル(idで紐付け)で、
Aの行が削除されたらBの行を削除するが、Bの削除でエラーが出た場合はAの削除をロールバックする。
という処理を行いたいのです。(ロールバックが可能であれば、ストアドプロシージャでなくても構いません。)
どのように書けば良いのでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
私も気になって調べてみました。
単純な語句で検索するだけではなかなかヒットしませんね。。
こういう場所で知識を共有していきたいところです。
実際に実行して試したわけではないので、動作の保障はしかねますが、
下記のような記述でロールバックを実現できるとの記載を見つけました。
CREATE PROCEDURE proc(....., ...)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
END;
START TRANSACTION;
:
:
:
COMMIT;
END;
http://ameblo.jp/hotbrain/entry-10477377702.html
http://dev.mysql.com/doc/refman/5.1/ja/declare-h …
DECLARE ... BEGIN ... END が catch,
START TRANSACTION ... COMMIT が try
みたいなイメージでしょうか、よくわかりませんが。
DECLAREの後とFORの後のキーワードには幾つか選択肢があるようなので、
ご自信の実現したい処理に応じて使い分けてみてください。
それから、机上の空論をひとつ。
上記のような記述をした場合でも、ストレージエンジンの差異による
トランザクション処理実行の可否はあると思っています。
トランザクション処理が可能なのはinnoDBのみ、MyISAMでは不可能です。
http://d.hatena.ne.jp/akio0911/20080327/1206586425
> 質問者様
既知でしたらすみません。
> 質問者様、閲覧者様
ここまでの内容に誤りがありましたら、ご指摘ください。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- MySQL MYSQL エラー 2 2022/10/18 11:37
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- Ruby pandasでsqlite3にテーブル作成・追加・読み出しでindexの取り扱い方教えてください 5 2023/03/08 09:57
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL テーブル作成時のカラムについて 2 2022/08/27 21:48
- MySQL php テーブルを作れない 2 2022/11/17 18:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
複数テーブルのGROUP BY の使い...
-
SQLサーバから、項目の属性(型...
-
副問合せの書き方について
-
WordpressのContact form 7でzi...
-
[MySQL] 1対多のリレーションで...
-
MySQL NULLだけをカウントして...
-
Yahoo .comの idには年齢制限、...
-
VIEWの元のテーブルのindexって...
-
android.R.id.text1はどこにある
-
液晶テレビの色鉛筆の落書きを...
-
JOIN後同一名カラムから値がと...
-
URL と行番号の指定
-
1対多結合で多を絞り込み条件と...
-
green houseのGH-YMP24-GD...
-
mysqlで特定のカラムから下4桁...
-
別テーブルからSELECTした値を...
-
学校の課題のSQLでVIEWの意味と...
-
MySQL 複数個の値を取るカラム...
-
複数JOINしているとCOUNTが正し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報