update実行時の追加情報の取得について
- 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 以上、よろしくお願いいたします。
- kokubunta
- お礼率84% (11/13)
- MySQL
- 回答数1
- ありがとう数1
- みんなの回答 (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';"); で得られないでしょうか?
関連する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
- 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文でできない場合でも、何かしらの解決方法がありましたら、よろしくお願いいたします!!!
- 締切済み
- Java
- 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文でできない場合でも、何かしらの解決方法がありましたら、よろしくお願いいたします!!!
- 締切済み
- MySQL
- 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順)でもなさそうです。 この、順番は何で決まっているのでしょうか?
- ベストアンサー
- SQL Server
- 実行結果に連番を振る方法
こんにちは。 以下を実行すると、ブラウザに結果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
お礼
やはり、一度Selectを使用することで解決しました。 あいがとうございました