php/mysqlについて。


データベースへデータを保存するときに、例えば

「ユーザーデータ」を

・テーブルA(認証用にメアド・パスワード)
・テーブルB(名前などその他の情報)

の2つに保存したいとします。

この場合、2回SQLを発行しますが、
もし「テーブルAに登録した後、テーブルBの登録時になにかエラーがあった」場合、
どのような処理を行なえばいいのでしょうか?

DBのシステムはMyISAMを使っています。

このような「ユーザーが1回ボタンを押すと、2ヶ所のテーブルへデータを保存・更新」するとき、
どのような処理を行なうべきなのか、参考になる情報などがありましたらお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/06/29 23:10:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント100pt

利用場面や運営方針によりますね。軽く例をあげていきたいと思います

 

(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:onigirin

どうもありがとうございます。

フレームワークを使っているので、プライマリーキーが連番idに固定されているので、InnoDBが良さそうですね。

InnoDB使ったことないのですが、ちょっと調べてトランザクション試してみます。

B案の、開き直りで再登録を促す作戦はあちこちでごり押しで使えそうなので、いいですね(笑)

2011/06/23 14:56:38

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません