MySQLでのデータのINSERT時に既存レコードが更新されない理由

このQ&Aのポイント
  • MySQLのINSERT文には、既に存在するレコードの場合に更新処理を行うための構文があります。しかし、質問のような構文では正しく更新されず、新たにレコードが追加されてしまいます。
  • 構文の問題点は、ON DUPLICATE KEY UPDATE句に指定するキーが不正確であることです。ID = 1ではなく、TABLE_ID = 2のレコードが更新されるべきです。
  • 正しい構文としては、INSERT INTO TABLE_A (TABLE_ID, COUNT) VALUES (2, 1) ON DUPLICATE KEY UPDATE COUNT = 1となります。正しいキーを指定し、更新するカラムも正確に指定することが必要です。
回答を見る
  • ベストアンサー

ON DUPULICATE UPDATE

データをINSERTする際にすでにレコードがある場合、mysqlで ON DUPULICATE UPDATEで更新処理が出来ると思うのですが なぜかINSERTされてしまいます…。 ID TABLE_ID COUNT 1 1 1 2 2 2 3 3 3 INSERT INTO TABLE_A SET TABLE_ID = 2, COUNT = 1 ON DUPULICATE UPDATE ID = 1 この構文をした場合に以下のようにしたいのですが 何がいけないのでしょうか…。 お分かりになる方よろしくお願い致します。 ID TABLE_ID COUNT 1 2 1

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

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

  • ベストアンサー
回答No.1

まず、要件が明確になっていません。 (1)PRIMARY KEY または UNIQUEキーがどれなのか (2)(1)で重複がなかった場合、どうしたいのか (3)(1)で重複した場合、どうしたいのか また、ON DUPLICATE KEY UPDATEの使い方を誤解しているようです。 例えば、INSERTしようとして、ID列での重複発生時、TABLE_ID列、COUNT列に挿入しようとした値でUPDATEするなら、次のような指定例になります。 INSERT INTO `TABLE_A` VALUES(1,2,1) ON DUPLICATE KEY UPDATE `TABLE_ID`=VALUES(`TABLE_ID`) ,`COUNT`=VALUES(`COUNT`) この例が希望するもっとも適切なSQL例であるかどうかは、提示された内容からでは判断できません。

NeilMania
質問者

お礼

メッセージありがとうございます。 スイマセン、ご連絡遅くなりました。 ちょとやり方を変えて出来るようになりました。ありがとうございました。

関連するQ&A

  • ON DUPLICATE KEY UPDATE

    こんにちは。 PHP + MYSQL でシステム構築をしております。 この度は、新しいレコードを INSERT するが、もしもINSERT するレコードのうちの主キーが既に存在する場合は、UPDATE を行うという処理をしたいと思っています。 調べているうちに MySQL 4.1.0 の新機能である ON DUPLICATE KEY UPDATE 節というものがありましたが、4.1.0以前の MYSQL を利用の場合はどのようにするのが最適でしょうか? 私が考えたのは、挿入前に主キーを持つレコードを読み込んで、レコードが返ってこなかった場合は INSERT、何かレコードが返ってきた場合は UPDATE というようにする方法ですが、少し回りくどい気もします。 クエリのみで、またはシンプルな方法でこれを解決する方法はありますでしょうか? ご教授お願いいたします。

    • 締切済み
    • PHP
  • 1テーブル&複数レコードの更新に対して1度のupdate文での処理方法

    1テーブル&複数レコードの更新に対して1度のupdate文での処理方法 Delphi2010+SQL SERVER 2005で開発しています。 update文で、 現在下のようにwhileで複数レコードに対して、 1回、1回、sqlを発行して、更新しています。 これを、一度のSQLの発行で処理できないものでしょうか? 更新テーブルは1つで、更新する項目も同じです。 更新するデータと、where句の条件が異なります。 もし可能なようでしたら、どうかご教授お願いします。 update table set A=1,B=2 where id=1 update table set A=2,B=3 where id=5 update table set A=9,B=99 where id=7 update table set A=5,B=10 where id=15 update table set A=1,B=10 where id=75

  • PEAR DBのupdateについて

    PEAR DBにて複数のデータを一度にUPDATEにて更新しようと思っているのですが、うまくいきません。 foreach($data as $value){   $SQL = "update `table_name` set `id` = '" .addslashes($value). "';"; } $res = $this->db->query($SQL); まず、update分をデータ分foreachにて溜め込み、一気にクエリを投げております。insert文の場合はうまく処理してくれるのですが、updateの場合はエラーが返ってきてしまい、処理してくれません。updateの場合、PEAR DBでは不可能なのでしょうか? お分かりになる方、ご教授ください。よろしくお願いいたします。

    • 締切済み
    • PHP
  • UPDATEできない

    PHP4.3+MySQL4.0.25+Win2000Proで構築中です。 条件が一致するかどうか調べて、一致するレコードがあれば上書き、一致しなければ新規登録をさせています。 mysql_select_db("table_name", $mysql); $result=mysql_query("SELECT * FROM challenge WHERE id=$id && dai=$dai && tyu=$tyu && syo=$syo", $mysql); $number = mysql_num_rows($result); とし、 if($number){ $sql="UPDATE challenge SET mycom='$mycom', procom='$procom', sinsei='$sinsei' where id=$id and dai=$dai and tyu=$tyu and syo=$syo"; $update=mysql_query($sql,$mysql); }else{ $sql="INSERT INTO challenge values ('$id','$dai','$tyu','$syo','$status','$mycom','$procom','$taicom','$sinsei','$kyoka')"; $insert=mysql_query($sql,$mysql); } mysql_close($mysql); 一致するレコードがあれば上書き、なければ新規登録させようとしていますが、新規書き込みはできるのですが上書きができません。 エラーがでるわけでもなし、ただ変化がないというだけです。 $updateの中身を見てみましたが何も入っていません。 ユーザーにはupdate権限がありますし、テーブルに権限は設定していません。 何かお気づきの点がありましたらご教授お願いいたします。

    • ベストアンサー
    • MySQL
  • INSERT文とUPDATE文の使い分け

    いつもお世話になっております。 MYSQLで x_table ID SUBID  1  aaa 2 aaa 3 bbb 4 ccc というテーブルがあったとして、「IDが 1 かつ、SUB_IDが aaa」の項目が存在する場合はUPDATE、存在しない場合はINSERT、という形でSQLを使い分けたいと考えています。 現在は SELECT * FROM x_table WHERE ID=1 AND SUBID='aaa' というSQLでレコードの存在確認をし、その結果によりif文でUPDATE文とINSERT文を使い分けているのですが、レコードの存在確認とINSERTやUPDATEのSQLを一つにまとめる事が出来るようなやり方って無いでしょうか? 無さそうな場合は「無い」とだけでも答えていただけるとうれしいです。

    • ベストアンサー
    • PHP
  • MySQLでWHEN句のサブクエリ中にて

    MySQL ver.5.0.95です。 PHPからSQL文を作ってDBへインサートしているのですが 重複した値が合った場合はupdateするように書いています。 TBL1には |id   |string   |count 1    aaa    0 2    bbb    3 3    ccc    1 TBL2には |id2    |string2    |count2 1      aaa      0 2      bbb      2 3      ccc      1 実際はもう少し複雑ですが、こういう感じでデータが入ってるとします。 このとき、TBL1のそれぞれをインサート若しくはアップデートするのに TBL2の同一IDのものの、count2の状態によって場合分けしたく 同一IDのcount2が1以上なら変更しない、という風にするため以下のように書いたのですが insert into TBL1 values (1, "aaa", 3), (2, "bbb", 3), (3, "ccc", 3), (4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = values(id)) >=1 THEN count ELSE count + values(count) END; #1064 - You have an error in your SQL syntax;というエラーになって出来ません。 WHENの中のサブクエリで、where id2 = values(id) 恐らくこの文がダメなようです。 例えば決め撃ちで1つ1つ書くと通ります。 insert into TBL1 values(1, "aaa", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 1) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(2, "bbb", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 2) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(3, "ccc", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 3) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 4) >=1 THEN count ELSE count + values(count) END; これをエラーになったような文に変えて1文にまとめたいのですが、無理でしょうか? あとそもそもこれをまとめたほうが速いと思ってそうしたいのですが、 変わらないのなら1文1文;でつなげて書くやり方でいこうと思っています。 まとめると速くなることはあるでしょうか?

    • ベストアンサー
    • MySQL
  • IDに欠番があった場合のupdate処理

    お世話になります。 配列でデータを受け取って、下の様な構文を書けばPDOを使用してupdateできますが、 データの削除を行って、idが欠番になった場合の対策として、どの様に書けば良いのかが 分かりません。 ------------------------------------------------- $id = $_POST['id']; $test = $_POST['test']; $sql = "UPDATE test_table SET test = ? WHERE id = ?"; $stmt = $conn->prepare($sql); foreach ($test as $id => $value) { $stmt->execute(array($value, ++$id)); } ------------------------------------------------- もし削除処理が行われたら、欠番の穴埋めを行い、尚且つidは オートインクリメントしているので、最終のidを取得してALTER TABLEで 新規データを追加した際にも欠番が出ないようにしようかとも考えましたが、 効率的とは思えなかったので、もしidに欠番があっても該当する「 id 」に 正常にデータをupdateできる構文をご教示いただきく存じます。 ---------------- ▼スペック PHP 5.3.3 MySQL 5.0.95 ----------------

    • ベストアンサー
    • PHP
  • UPDATE 2回の整合性

    MySQL 3.23.38 on Redhatです。 PHP4.2から、mysql_queryでsqlを送っています。 同じテーブルに、UPDATEを2回連続で行うと、 2回目で「0」を返して、整合性が取れません。 UPDATE table_name SET Note = REPLACE(Note,'<NEW>','') WHERE id = 1 UPDATE table_name SET Note = CONCAT(Note,'<NEW>') WHERE id = 1 見たいな感じです。 どうも2回目のUPDATEのCONCATの中のNoteが、「0」を返しています。 テーブルをロックしても、問題が解決されませんでした。 なにか良い方法があれば、教えてください。

  • MDB2の操作について

    MDB2を使用しMYSQLの操作をしております。データが無いものは INSERTし、既にあるものはUPDATEしたいという状況になり調べて みたところON DUPLICATE KEY UPDATEが使えるようでした。 ここまではいいのですがON DUPLICATE KEY UPDATEを知ったのも 初めてなものでMDB2で使用したくマニュアルを見たのですが どのような構文になるのかを見つけることができず困っております。 MDB2でこれを使用するにはどのような構文になるのでしょうか? 通常のINSERTの場合ですが現状は以下のようなソースで行っています。 ※idがPRIMARY KEYです。 $fields = array('id' => 1, 'name' => 'あああ'); $res = $mdb2->extended->autoExecute(test, $fields, MDB2_AUTOQUERY_INSERT); 詳しい方いらっしゃいましたら宜しくお願い致します。

    • ベストアンサー
    • PHP
  • update文の副問い合わせ使用

    2つのテーブルを結合して、片方のテーブルをUpdateしたいが、Update文での結合方法がよくわかりません。 table_a の excode列が更新対象で、table_aのname列とtable_bのname列の等価結合です。 テーブルとデータの例は以下です。 テーブル1:table_a create table table_a (code int(3), name varchar(10), excode int(6)); insert into table_a values (101,'あいう',0),(102,'かきく',0),(103,'たちつ',0),(201,'なにぬ',0),(301,'わをん',0); テーブル2:table_b create table table_b (excode int(6), name varchar(10)); insert into table_b values (500101,'あいう'),(500102,'かきく'),(500103,'たちつ'); 期待する結果は以下です。 SQL> select * from table_a; +------+--------+--------+ | code | name | excode | +------+--------+--------+ | 101 | あいう | 500101 | | 102 | かきく | 500102 | | 103 | たちつ | 500103 | +------+--------+--------+ MySQLバージョンは、5.0です。 よろしくお願いいたします。