
こんばんは
業務で以下の切り分けをしたいのですが、可能でしょうか。
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件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
>切り分けをしたいのです
切り分けをした後にどうしたいかによって処理は全然ことなります。
考えられるのは
(1)updateの前にチェックをかける
(2)updateを多重的におこなう
のどちらかでしょう。
回答、ありがとうございます!!
切り分けをした後、
updateしたいデータそのものがない場合、insertを行う。
updateしたいデータはあるが、PK以外の条件は合致しない場合、エラーとして返す。
という処理の分割をしたかったのです。
(1)updateの前にチェックをかける
が順当だと思われますが、パフォーマンスを勘案すると、難しいと思われました。
No.1
- 回答日時:
お求めの回答とは少し違うのですが、こう言うのはどうでしょうか。
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文を生成する際に簡略化できるようにしてみてください。
回答、ありがとうございます!!
SQL文でif文が書けること自体、知りませんでした。更新カラムが多いので、ちょっと複雑になりますが、select文で更新前にチェックをかけるよりは、早くなりそうです。
回答いただきました内容ですと、
1.すべての条件が合致した場合、mysql_affected_rowsが1カウントされる
2.PKは合致するが、その他の条件が合わない場合は、mysql_affected_rowsが0で、matchedが1カウントされる
3.すべての条件が合致しない場合、mysql_affected_rowsもmatchedも0になる
という結果になると思いますが、PHPのマニュアルでは、matchedの数を取得する関数を見つけられませんでした。どうやったら、結果をとることができるんでしょうか。ご教授いただければと思います。よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
3つ以上のテーブルをUNIONする...
-
テーブルのレコード削除ができ...
-
Accessにインポートしたら並び...
-
SQLデータ修正時に『このレコー...
-
2つの項目が重複するレコード...
-
Access 削除クエリが重い
-
ManagementStudioからのデータ削除
-
(ACCESS)並び替えをしないで...
-
MySQLでTIMESTAMP型の列から現...
-
ACCESS VBA コマンドDoCmd.Open...
-
C# Windows Forms で、Accessみ...
-
DB INSERT 時の排他制御について
-
ACCESSファイルを開こうとする...
-
ACCESSのBookmarkプロパティの...
-
ACCESSにて全項目(レポート)...
-
Accessでレコードが更新された...
-
SQLServerで同一条件レコードの...
-
フォームで1レコード削除したの...
-
Access カレントレコードがあり...
-
数百万件レコードのdelete
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
3つ以上のテーブルをUNIONする...
-
Accessにインポートしたら並び...
-
データの二重表示の原因
-
ACCESSのBookmarkプロパティの...
-
Access 削除クエリが重い
-
Access VBA Me.Requery レコー...
-
Access 1レコードずつcsvで出力...
-
2つの項目が重複するレコード...
-
数百万件レコードのdelete
-
SQLデータ修正時に『このレコー...
-
複数レコードをUPDATE文一文で...
-
SQLServerで同一条件レコードの...
-
Accessの重複クエリで最小以外...
-
Accessでレコードが更新された...
-
(ACCESS)並び替えをしないで...
-
テーブルのレコード削除ができ...
-
Accessで重複したデータを一件...
-
MySQL+PHP 特定レコードの更新...
-
曜日を格納する方法はどちらが...
-
ManagementStudioからのデータ削除
おすすめ情報