• ベストアンサー

PHPシステムでSQLのUPDATEがあればINSERTはいらないと思うのですけど?

PHP4ベースの勤怠管理システムみたいなものに、 各支社が自身のアクセスIDとパスでアクセスし、 日々、いろいろデータを登録しています。 この既存システムを流用し、各支社がログイン後、トップメニューに PHP4+MySQLベースのアンケートフォームを設け、回答をMySQLに 登録するような仕組みを考えているのですが、ここでごく基本的な 疑問があります。 アンケートは、 Q1がチェックボックス→「q1」 varchar(1) Q2がラジオボタン→「q2」 varchar(1) Q3がテキストのフリーワード→「q3」 varchar(50) のようになって、現状全てNULLなわけですが、 SQL部分はUPDATE文で作成するものでしょうか。 最初はINSERTで、二回目以降表示したとき(回答を変更修正したい時) は、登録されているものを各フォームに復元しつつ、 全てUPDATE文で上書きというのが基本なのかと推測してますが、 NULLから回答値にUPDATEすれば、最初からUPDATE文しか用意しなくても よいと思うのですけど。 ひいては、INSERT文の存在意義がよくわからなくなってきています。 このケースでは、最初にアンケートを表示し、回答がなされたら INSERTでDBに登録、みたいにしなければだめなのですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • duke13
  • ベストアンサー率100% (1/1)
回答No.5

一般的には、最初はinsertで、その後はupdate となりますね。これの場合はデータが存在するかの確認が必要になるので、その前にselectも必要になってしまいます。 そこで、MySQL 限定の話になりますが、それをいっぺんにおこなうことができるのがありまして、replace といいます。 primary key の設定など制約がありますが、当たり前の制約なので、そんなに難しくないと思います。

参考URL:
http://mysql.speedbone.de/doc/refman/4.1/ja/replace.html
litton101
質問者

お礼

duke13さん、御礼遅くなりました、今日、ようやく作業に戻ってきまして、 再度検討を始めたところです。わたしが不便というか質問したかったのは、 まさに 「これの場合はデータが存在するかの確認が必要になるので、その前にselectも必要」 というところでした。 そこで、ご紹介のREPLACE文、入門書などをみてみましたら、まさに 本件にぴったりのように思います。 MySQL限定って、こんな需要がありそうなものを他のRDBには実装されて いないのですかね。 ともかく、これで効率よく作れそうです、ありがとうございました。

その他の回答 (4)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

常道なのかどうかわかりませんが、 「INSERT IGNORE INTO テーブル」でプライマリーキーを いれると、すでにデータがあれば無視され、データが なければプライマリーだけのデータができますので そこでUPDATE テーブル WHERE プライマリーが一致 のようにやれば、分岐は発生しません

litton101
質問者

補足

yamabejpさん、いつもお世話になります > 常道なのかどうかわかりませんが、 > 「INSERT IGNORE INTO テーブル」でプライマリーキーを > いれると、すでにデータがあれば無視され、データが > なければプライマリーだけのデータができますので > そこでUPDATE テーブル WHERE プライマリーが一致 > のようにやれば、分岐は発生しません すみません、大変興味はあるのですが、具体的に想像できません。 アンケート格納テーブル(t_question)には 各支社のログインIDをプライマリキーとして収めますが、 これらのIDを、あらかじめt_questionにInsertしておけば よいということでしょうか。

noname#22222
noname#22222
回答No.3

スーツの単なるデザイナでプログラマではありませんが・・・一言。 勤怠管理データベースであれば、INSERT文は必須と思います。 単に、単一ページアンケートシステムではUPDATE文だけで事足ります。 問題は、回答をデータベース化するのかしないのか? ここに尽きると思います。

litton101
質問者

お礼

回答ありがとうございました。 回答をメールで送られてくるようなものも考えましたが、 やはりDBに集約したいです。 集計がラクなのと、どこが未回答のチェックかわかりやすく、 なにより、既存のシステムの枠を活用できるからです。 システム自体は外注で専門業者が作ったので、当然Insert文は 各所で使われているわけですが、 わたしが勉強を兼ねて一時的なアンケートを作ることになりました。 わからないことを整理してみたことを、#2さんへの御礼に書いて あります。もしよろしければご参照ください。

回答No.2

どういう構造にしたいのかもう少し詳しく知りたい所ですが、一人に対して1つの回答しか許さない構造なのですよね?質問者様の内容ですと確かに初回回答時のみInsertで問題ないと思われます。どちらにせよ初回にはInsertが必要になるのですが・・・。 >INSERT文の存在意義 新規にデータを追加する場合は必ず必要になりますが? 例えばアクセスログをDBに残したい場合など、予約システムな等であれば予約ログなど、使用用途は様々ですが重要なコマンドであることは確かです。 私もよくお世話になります(笑)

litton101
質問者

お礼

ばらばらとすみません。 アンケートに回答済みか未回答かは、 回答を収めたMySQLのテーブルにフラグを設けたり するのが一般的でしょうか。 そのあたりの王道的手段を知りたいです。 未回答者用アンケート(Insertモード).php 回答済み用アンケート(Updateモード).php と2種類用意し、 アンケートページに遷移する前に、ハイパーリンクの段階で どっちを表示させるか切り替えるべきですかね? あるいは、アンケート.php 内で、 if (回答済みフラグがたっている){   UpdateモードのHTMLを展開し、さらに   DBも読み込んで、既存の回答を表示 } elseif (まだ未回答である){   InsertモードのHTMLを展開するだけ } みたいに処理を分けるとか?

litton101
質問者

補足

ご回答ありがとうございました。 >どういう構造にしたいのかもう少し詳しく知りたい所ですが、 > 一人に対して1つの回答しか許さない構造なのですよね? まさにその通りです。 ブラウザで東京支社の社員がシステムにログインして、 メニューに入ると、 ------------- 東京支社 ------------- ●勤怠管理 9月 ●予算計画 9月 ●連絡先 -------------- みたいな雰囲気で、当該支社のメニューが表示され、ここに ●アンケート という項目を追加したいです(●は全てハイパーリンク)。 そしてアンケートページ(question.php)に遷移した際、 (1) 初めてこのアンケート画面を表示した、あるいは   表示は初めてでなくても未回答 なのであれば、前質問が空白のフォームを出し、裏で動いている PHPプログラムにはInsertモードのSQLを用意しなければならない でしょう。例えば、以下のように。 回答者性別 ○男 ○女 回答者所属 [      ] 他方、 (2) 既に回答済みだが、誤りがあったので訂正、修正、更新 したいのであれば、裏のプログラムではUpdateモードである ことを判別し、既存の回答をアンケートテーブルから読み 込んで表示してあげなければならないでしょう。例えば、 回答者性別 ◎男 ○女 回答者所属 [東京支社第一営業部]  のように。 この判断がわからないので、Insertモードなど経ず 一律にUPDATEモードで開けばいいんじゃないのかと思ったしだいです。 しかし、 > 新規にデータを追加する場合は必ず必要になりますが? ということは、駄目ですね。

  • yuchi-co
  • ベストアンサー率60% (29/48)
回答No.1

予め何件のデータが入るか判っていて、テーブルに回答数分の行がINSERTされているのであれば、UPDATE文だけでできると思いますが。 テーブルが作成されただけでは、行は存在しないので、最初の回答でINSERT→回答の変更でUPDATEが自然だと思います。

litton101
質問者

お礼

早速のレスありがとうございました。 やっぱりそうですよね。 InsertモードかUpdateモードかをどうやって 切り替えるかがよくわからないしだいです。 だったら、最初からInsert飛ばして Updateモードオンリーで運用できるのでは? と短絡的に考えました。 もう少し勉強してみます。ありがとうございました。

関連するQ&A

専門家に質問してみよう