MySQL5.5の検索に関する質問です。

テーブルは以下の構造とし、PDOを使用しています。
PHPは7.0。

テーブル名:users
aId int auto_increment primary key,
bId int,
created datetime,
modified datetime

bIdを検索し、存在したらレコードのmodified更新、無かったらbId, created,をセット後レコード追加。
直後に、更新もしくはインサートされたレコードのaId含む全フィールドを取得したい・・・。
とした場合、更新やインサートと同時にレコードを取得する方法はありますか?
それとも、bIdでもう一度検索かけないとだめですか?

よろしくお願いします。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2016/01/18 22:40:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:muranet No.1

回答回数8ベストアンサー獲得回数0

ポイント100pt

(1)bIdを検索し、存在したらレコードのmodified更新
bIdで検索するときに select bId from users ~ ではなく select * from users ~で取ってきたら、該当レコードの情報はどこかに保存しておけそう。

(2)無かったらbId, created,をセット後レコード追加
新規に追加するレコードのaId 以外の情報はプログラムで指定するのですよね? aId は 最後に挿入された行のID を取得する命令
http://php.net/manual/ja/pdo.lastinsertid.php
で取れそうです。

他1件のコメントを見る
id:muranet

はい、こちらの状況でしたら、DBに追加または更新をする前の段階でPHP側で該当レコードの情報は持っているはずなので、その情報を使います(新規に追加したレコードのIDは上記ページの命令で取れるはず)。

>try catch 内に記述すれば万に一つのイレギュラーも発生しませんか?
基本的には前後にtry catch を置いて適切にエラーハンドリングをするようにすれば、何らかのエラーが発生した場合はハンドリングされるはずです。少なくても私の経験上では、try catchを入れているのにDB更新が空振りし、ハンドリングもできなかった、というケースは見たことがないです。1秒に数万レコード更新する、とかのようなシビアな状況は経験したことがないので分かりませんが、基本的にはPHPとMySQLに用意されているエラーハンドリングの仕組みをじゅうぶん信用してよいでしょう。

想定どおり動かないのであれば、自分が書いたプログラムが間違っている可能性のほうが高いです。不安であれば、追加・更新用のSQL文をログに残すとかするとよいかもしれません。

2016/01/12 13:40:47
id:wsapp

ご親切にありがとうございます。

>不安であれば、追加・更新用のSQL文をログに残すとかするとよいかもしれません。
早速、教えていただいた方法で書いてまいります。
ありがとうございましたm(_ _)m

2016/01/12 13:49:36

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

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

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

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

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