データベースへデータを保存するときに、例えば
「ユーザーデータ」を
・テーブルA(認証用にメアド・パスワード)
・テーブルB(名前などその他の情報)
の2つに保存したいとします。
この場合、2回SQLを発行しますが、
もし「テーブルAに登録した後、テーブルBの登録時になにかエラーがあった」場合、
どのような処理を行なえばいいのでしょうか?
DBのシステムはMyISAMを使っています。
このような「ユーザーが1回ボタンを押すと、2ヶ所のテーブルへデータを保存・更新」するとき、
どのような処理を行なうべきなのか、参考になる情報などがありましたらお願いします。
利用場面や運営方針によりますね。軽く例をあげていきたいと思います
(A案)トランザクションもどきの判断をphpで行う
・面倒だし、phpで行うなら素直にInnoDB使うほうが簡単で高速ですね
(B案)テーブルAだけで何が悪いと開き直る
・テーブルAの情報はそのまま残して「詳細情報の登録は失敗しました」と再登録を促がす
・テーブルAはメアドをプライマリキーとしておいて INSERT ... ON DUPLICATE KEY UPDATE 構文での書き込み処理を行う
http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html
(B案改)テーブルAとテーブルBの登録は分ける
・とりあえずシステムを利用するために「メアド/パスワード登録」を行わせ、詳細に使いたいなら「名前などの詳細情報登録」を行わせるという2つの作業に分けてしまう
ケースバイケースなので、まだまだ案はあると思いますが、無難なところでやっぱりInnoDB使っておけばいいという結論になりそうな気もします
どうもありがとうございます。
フレームワークを使っているので、プライマリーキーが連番idに固定されているので、InnoDBが良さそうですね。
InnoDB使ったことないのですが、ちょっと調べてトランザクション試してみます。
B案の、開き直りで再登録を促す作戦はあちこちでごり押しで使えそうなので、いいですね(笑)