重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんばんは

業務で以下の切り分けをしたいのですが、可能でしょうか。
SOAP通信を使っていて、パフォーマンス的な観点から、select文は使用したくないと思っています。

■環境
・PHP5
・MySQL
・FreeBSD6
■やりたいこと
Update文で更新を行ったときに、データそのものがなくて更新できなかったのか、データは存在するがPK以外の条件がマッチしなくて更新できなかったのかで、エラーコードを分けたい
例えば、
 update tableA set column1='aaa' where pk1=1 and pk2=2 and column2='bbb';

といったSQL文で、「pk1=1 and pk2=2」に合致するデータがないのか、データは存在するが「column2='bbb'」には合致しなくて更新されないのかの切り分けをしたいのです。


かなり、困ってしまっています。
SQL文でできない場合でも、何かしらの解決方法がありましたら、よろしくお願いいたします!!!

A 回答 (2件)

>切り分けをしたいのです



切り分けをした後にどうしたいかによって処理は全然ことなります。
考えられるのは

(1)updateの前にチェックをかける
(2)updateを多重的におこなう

のどちらかでしょう。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます!!


切り分けをした後、
updateしたいデータそのものがない場合、insertを行う。
updateしたいデータはあるが、PK以外の条件は合致しない場合、エラーとして返す。

という処理の分割をしたかったのです。
(1)updateの前にチェックをかける
が順当だと思われますが、パフォーマンスを勘案すると、難しいと思われました。

お礼日時:2008/09/07 23:06

お求めの回答とは少し違うのですが、こう言うのはどうでしょうか。



PKの条件が満たされない場合は、更新件数が 0 かを確認してエラーとし、
PKの条件が満たされる場合で、PK以外の条件が満たされない場合は、
更新対象項目を更新しないだけでエラーとしない、と言う方法です。

update tableA set column1=if(column2='bbb','aaa',column1) where pk1=1 and pk2=2;

こうすると、PKの条件を満たすレコードが対象になるので、
mysql_affected_rows()を確認して 0 ならPKの条件を満たすレコードがなかった事になります。
column1はPK以外の条件が満たされる時に値を変更しますし、
そうでない時は元の値を入れるので実際には更新されない事と同じになります。
ただ、もし更新しようとする値が、たまたま、更新前と同じだった場合に、
更新結果が更新前と同じ時はmysql_affected_rows()が 0 を返すようなので、
PKの条件が一致しなかった確認でひっかかってしまいエラーとなってしまいます。
この対策としては、更新日時や更新回数のような項目を用意しておいて、
PK以外の条件が満たされていれば必ず別の値に更新する事で解消されます。

更新日時の場合。
update tableA set
column1=if(column2='bbb','aaa',column1)
,column_update_datetime=if(column2='bbb',now(),column_update_datetime)
where pk1=1 and pk2=2;

更新回数の場合の3行目。
,column_update_numbertimes=if(column2='bbb',column_update_numbertimes+1,column_update_numbertimes)

例では更新対象項目やPK以外の条件が少ないので簡単な記述ですが、
複数になってくると少し面倒な記述になると思います。
それは PHP でSQL文を生成する際に簡略化できるようにしてみてください。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます!!

SQL文でif文が書けること自体、知りませんでした。更新カラムが多いので、ちょっと複雑になりますが、select文で更新前にチェックをかけるよりは、早くなりそうです。
回答いただきました内容ですと、
1.すべての条件が合致した場合、mysql_affected_rowsが1カウントされる
2.PKは合致するが、その他の条件が合わない場合は、mysql_affected_rowsが0で、matchedが1カウントされる
3.すべての条件が合致しない場合、mysql_affected_rowsもmatchedも0になる

という結果になると思いますが、PHPのマニュアルでは、matchedの数を取得する関数を見つけられませんでした。どうやったら、結果をとることができるんでしょうか。ご教授いただければと思います。よろしくお願いいたします。

お礼日時:2008/09/07 23:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す