update実行時の追加情報の取得について

このQ&Aのポイント
  • update文をマルチクエリ実行した際の成功、エラー、インサート時の処理の条件について説明します
  • update tableAでpkとcolumn1の条件を設定し、affected_rowsの結果から成功、エラー、インサートの処理を判別する方法について質問しています
  • 環境はPHP5、MySQL(MySQLi接続)、FreeBSDです
回答を見る
  • ベストアンサー

update実行時の、追加情報の取得について

こんばんは。 業務で、以下の情報を知りたいと思います。 5000件のupdate文をマルチクエリ実行した際に、 1.すべての条件が合致して、更新された(成功) 2.PKは合致するが、他の条件は合致しなかった(エラーとしてエラーコードとリクエスト情報を返します) 3.PKが合致するデータ自体が存在しなかった(対象のリクエストデータのみ、インサートの処理が実行されます) 以上を実現するために、以下のようなSQL文を作成して実行しようとしています update tableA set column1=('aaa','bbb',column1) where pk='xx'; 1.pk='xx'かつcolumn1='aaa'が満たされた場合、affected_rowsは1になります。 3.データ自体が存在しないので、affected_rowsは0です 2.については、matchedは1だが、changedは0という結果から判別したいのですが、関数としては、mysqli_infoを使用するしかないでしょうか。文字列が返却されてくるので、必要な情報(matchedとchangedのカウント)のみを取得できる方法を探しています 環境は、以下です PHP5 MySQL(MySQLi接続) FreeBSD 以上、よろしくお願いいたします。

  • MySQL
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • prorz
  • ベストアンサー率66% (2/3)
回答No.1

私の解釈が違うかもしれませんが、 3. SELECT COUNT(*) FROM tableA WHERE pk='xx'; で得られた結果が0なら一致するデータなし。※1 1. UPDATE tableA SET column1='bbb' WHERE pk='xx' AND column1='aaa'; で affected_rows で更新された行数が取得する。※2 2. ※1の結果から※2の結果の差で取得 multi_query("SELECT COUNT(*) FROM tableA WHERE pk='xx'; UPDATE tableA SET column1='bbb' WHERE pk='xx' AND column1='aaa';"); で得られないでしょうか?

kokubunta
質問者

お礼

やはり、一度Selectを使用することで解決しました。 あいがとうございました

関連するQ&A

  • MySQLのUPDATE実行結果を受け取る関数

    ↓コマンドライン上でのMySQLのUPDATE実行結果 Rows matched: 1 Changed: 0 Warnings: 0 Changed値は、mysql_affected_rows()で受け取れるのですが、 matched値を、受け取る関数はあるのでしょうか? ご回答よろしくお願い致します。

    • ベストアンサー
    • PHP
  • updateができない。

    mysql-4.1.11を使っています。 ひとつのDBの中にtableがふたつあります。仮にtable1,table2とします。 このふたつのテーブルについて select * from table1,table2 where table1_col1=table2_col1; というふうにすると、table1_col1とtable2_col1の値が等しいものだけ抽出してくれます。table1_co1,table2_col2というのはそれぞれのテーブルのカラムのひとつです。 しかし、同じ条件で update table1,table2 set table1_col2="A" where table1_col1=table2_col1; という命令を実行しても 「Query OK, 0 rows affected (0.00 sec) Rows matched: 0 Changed: 0 Warnings: 0」 というメッセージが出るだけでtable1_col2の値が変わりません。本当なら3つのデータが変わるはずです。 命令の仕方がおかしいのでしょうか? ほかにおかしなところがあるのでしょうか? よろしくおねがいします。

  • MySQLで更新の結果を知るには

    こんばんは 業務で以下の切り分けをしたいのですが、可能でしょうか。 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文でできない場合でも、何かしらの解決方法がありましたら、よろしくお願いいたします!!!

  • WHERE句の条件を区別する

    こんばんは 業務で以下の切り分けをしたいのですが、可能でしょうか。 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文でできない場合でも、何かしらの解決方法がありましたら、よろしくお願いいたします!!!

  • Selectした時のレコードの取得順

    SQL Server2005 で開発しています。 Order by で並び替えてレコードをSelectする際に、 Order by の対象列データが同じ場合は、 どういった順番でレコードが取得できるのでしょうか? TableA No | Data1 | Data2   1| AAA | 100   2| AAA | 200   3| AAA | 300   4| ABC | 400   5| BBB | 500 (Noはクラスタ化PK) 例えば、上のようなテーブルから次のSQLを実行すると  (1)Select * From TableA ;  (2)Select * From TableA Order by Data1 Asc;  (3)Select * From TableA Order by Data1 Asc, No Asc;  (1)(2)(3)全て、次の順で返ってきました。   1| AAA | 100   2| AAA | 200   3| AAA | 300   4| ABC | 400   5| BBB | 500  しかし、(2)のSQLは、データによって  次の順で返ってくることがありました。   3| AAA | 300   1| AAA | 100   2| AAA | 200   4| ABC | 400   5| BBB | 500    1~3レコード目までは全てData1がAAAのレコードですが  特に指定していなくても、No(PK)の順になるのかと思っていました。    なお、レコードができた(Insert順)でもなさそうです。  この、順番は何で決まっているのでしょうか?  

  • 実行結果に連番を振る方法

    こんにちは。 以下を実行すると、ブラウザに結果x, 結果x, 結果x・・・と表示されます。 xの部分を1, 2, 3・・・とさせたいのですが、うまくできません。 ご教示頂けませんか? 宜しくお願い致します。 <?php //データベース接続 $server = "127.0.0.1"; $userName = "root"; $password = "password"; $dbName = "tweet01"; $mysqli = new mysqli($server, $userName, $password,$dbName); if ($mysqli->connect_error){ echo $mysqli->connect_error; exit(); }else{ $mysqli->set_charset("utf-8"); } $sql = "SELECT * FROM tweet_tbl"; $result = $mysqli -> query($sql); //クエリー失敗 if(!$result) { echo $mysqli->error; exit(); } //レコード件数 $row_count = $result->num_rows; //連想配列で取得 while($row = $result->fetch_array(MYSQLI_ASSOC)){ $rows[] = $row; } //結果セットを解放 $result->free(); // データベース切断 $mysqli->close(); ?> <!DOCTYPE html> <html> <body> <table border='1'> <tr><td>結果</td></tr> <?php foreach($rows as $row){ ?> <tr> <td><a href='wxyz.php?id=$row['id']; ?'>結果x</a></td> </tr> <?php } ?> </table> </body> </html>

    • ベストアンサー
    • PHP
  • php updateできないのです

    PHP初心者です。phpMyAdminでは、実行できたのですが、 PHP文上ではできません。 *************************************************************** $sql = ""; $sql = $sql."update RKTN_WK_TBL set \n"; $sql = $sql."DATA1 = (select count(*) from RKTN_WK_TBL as sub \n"; $sql = $sql." where sub.BKN_CD = RKTN_WK_TBL .BKN_CD) \n"; $affected_rows = $ms->exec( $sql ); $ms->exec("COMMIT"); *********************************************************** ↑うまく更新している。 ↓ここから更新できない *********************************************************** $sql = ""; $sql = $sql."UPDATE RKTN_WK_TBL as rk \n"; $sql = $sql."INNER JOIN (SELECT * FROM GST_KHN_INF_TBL) as gst ON rk.KYKU_NO = gst.KYKU_NO \n"; $sql = $sql." SET rk.GST_ID = gst.GST_ID \n"; $affected_rows = $ms->exec( $sql ); $ms->exec("COMMIT"); ************************************************************ どこがダメなのでしょうか? 先週からハマって困っております。 echo $affected_rowsを見ても 0件のようで表示されません。 だた、phpMyAdminで実行した時に「フォームに入力されていない値があります。」とMSGが表示され その後、更新されています。これが問題なのでしょうか? どなたかご教授いただければ助かります。 よろしくお願いします。

    • 締切済み
    • PHP
  • VBA 表の並び替え (追加質問)

    先日表の並び替えでVBAを教えていただいたのですが、 できればもう少し詳しくご教授願いたいと思います。 【前回の質問】 同じ請求書内に含まれる情報をひとつの請求書列の横に並べて配置したいのですが。 請求書 製品 価格  個数 aaa   AAA  200  10 aaa   BBB  400  10 aaa   CCC  300  5 bbb   AAA  100  50 bbb   BBB  500  10 請求書 製品 価格  個数 製品 価格  個数 製品 価格  個数 aaa   AAA  200  10 BBB  400  10  CCC  300  5 bbb   AAA  100  50 BBB  500  10 にたいして、 Sub test()  Dim LastCol_1 As Long  Dim LastCol_r As Long  Dim LastCol_Max As Long  Dim LastRow_A As Long  Dim r As Long  LastCol_1 = Cells(1, Columns.Count).End(xlToLeft).Column  LastRow_A = Cells(Rows.Count, "A").End(xlUp).Row  Application.ScreenUpdating = False  'データの並べ替え  For r = LastRow_A To 3 Step -1   LastCol_r = Cells(r, Columns.Count).End(xlToLeft).Column   If Range("A" & r).Value = Range("A" & r - 1).Value Then     Range("A" & r).Resize(, LastCol_r - 1).Offset(, 1).Copy _      Destination:=Cells(r - 1, LastCol_1 + 1)     Rows(r).Delete   End If  Next r    '見出し行の編集  With ActiveSheet.UsedRange   LastCol_Max = .Cells(.Cells.Count).Column  End With  Range("A" & 1).Resize(, LastCol_1 - 1).Offset(, 1).Copy _      Destination:=Cells(1, LastCol_1 + 1).Resize(, LastCol_Max - LastCol_1)  Application.ScreenUpdating = True   End Sub というVBAコードをいただきました。 結果は大満足だったのすが、たとえばもし請求書columnの横に繰り返したくないcolumnがもう1列ある場合はどのようにしたらよいのでしょうか。請求書番号と同様1行に1回のみ表示させたいのです。 請求書 Year 製品 価格  個数 aaa   2007 AAA  200  10 aaa   2007 BBB  400  10 ↓↓↓↓↓↓↓↓↓ 請求書 Year 製品 価格  個数 製品 価格  個数 aaa   2007 AAA  200  10 BBB  400  10   お手数ですが、コメントいただければ幸いです。

  • PHPでDBから比較結果を取得する関数が作りたい

    タイトルの通りで、まず、データベース(MySQL)の例を以下。 ユーザー    単語  田中    初志貫徹  鈴木    一石二鳥  品川    四面楚歌 /***以下省略****/ のような感じでデータが入っています。 (なお、ユーザーは一意な値となっています。単語は重複します。およそ2万件登録されています。) ユーザーの名前を入力するとDB内を参照し、その組となる単語を出力する関数を考えています。 一応、以下のように作ってみたのですが、5つのテストデータを呼び出すだけで、3sもかかってしまいました。(PHP ver 5.4.1.6 eAccelerator適応済み環境にて確認) 比較処理の速度が遅く、使い物になりません。 もっと実行速度が速くなるような書き方を教えていただけないでしょうか? よろしくお願いいたします。m(_ _)m /************以下、関数のソースコード*********/ function conp_db($name){ //DBアクセス用変数 $cflag=true; $host = HOST; $user = USER; $password = PASSWORD; $database = DB; $table = TABLE; $data=''; $res = mysqli_connect($host, $user, $password,$database); if(!$res) { printf("MYSQLの接続に失敗しました。: %s\n",mysqli_connect_error()); exit(); } mysqli_set_charset($res,'utf8'); if($stmt = mysqli_prepare($res, "SELECT user,word from {$table}")) { mysqli_stmt_execute($stmt); //取得変数固定 mysqli_stmt_bind_result($stmt,$row['user'],$row['word']); while (mysqli_stmt_fetch($stmt) and $cflag) { if($name === $row['user'] and $cflag){ $data = $row[word']; $cflag = false; }else{ $data = 'nobody'; } } mysqli_stmt_close($stmt); } mysqli_close($res); return $data; }

    • ベストアンサー
    • PHP
  • インデックス作成について

    create index でインデックスを作成したところ Query OK, 7123 rows affected (0.07 sec) records:7123 Dupulicates:0 Warning:0 と表示されました。 しかしながら、indexを張ったカラムのデータは毎日200~500程度増え続けています。 今後、その増加分はindexされないままなのでしょうか? それとも自動的に増加分もindexされるのでしょうか?

    • ベストアンサー
    • MySQL