データの置換と新規挿入に関する条件付き操作

このQ&Aのポイント
  • データの置換と新規挿入についての条件付き操作の方法を教えてください。
  • tbl_1というテーブルにはid(主)、u_id、date、field1、field2というフィールドがあります。u_idとdateがテーブルのレコードと一致する場合、field1とfield2のデータを置換または新規挿入したいです。
  • 現在の試した方法では、一つの命令文で処理を行いたいが、シンタックスエラーが発生し、u_idとdateが一致するレコードがあっても新規レコードとして挿入されてしまいます。どのようにすれば一つの命令文で処理できますか?
回答を見る
  • ベストアンサー

条件付きでデータの置換と新規挿入

教えてください。 id(主)|u_id|date|field1|field2| と言うフィールドを持つテーブル[tbl_1]があります。 ポストするデータのu_idとdateがテーブルのレコードと一致する場合、 field1及びfield2のデータを置換 若しくは、挿入し、 u_idとdateが一致しない場合、新しいレコードを挿入したいと 思うのですが、これをひとつの命令文として行うことはできるでしょうか。 以下、試してみたことです。 replace into tbl_1(field1,field2) value(1111,2222) where u_id='1' and date='20110420' 上記では、シンタックスエラーが返ってきました。 次に、 replace into tbl_1(u_id,date,field1,field2) value(1,20110420,1111,2222) としたところ、u_idとdateが一致するレコードがあっても、 新規レコードとして挿入されました。 1回の命令文で処理を行いたいと思うのですが、 やはり、処理は分けた方が良いのでしょうか。 ご回答よろしくお願いいたします。

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

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

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

MySQLの質問をする場合は、MySQL 5.0、5.1といったレベルまで、最低限バージョンを明記してください。 大きな機能拡張に加え、一部の仕様変更があります。 「(u_id,`date`)の複合キーで重複した場合」とのことであり、primary key または uniqueキーにした上で、insert文の「on duplicate key update」構文を利用することで実装可能です。 replace文は、格納済みの行の特定列を更新するのでなく、行自体を置換してしまうのだったと記憶しています。 id列というprimary keyが必要なのかどうか不明ですが、uniqueキーを定義すると、例えば次のようなSQLになります。 -- 定義例 drop table if exists tbl1; create table tbl1 (id int primary key auto_increment ,u_id int ,`date` date ,field1 int ,field2 int ,unique(u_id,`date`) ); -- (u_id,`date`)が同一の行が存在しなければ追加、存在すれば更新 insert into tbl1 values(null,5,'2011-04-17',0,0) on duplicate key update field1=values(field1),field2=values(field2) ;

参考URL:
http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html
leoism666
質問者

お礼

chukenkenkou様: 回答ありがとうございました。 ヒントだけでなく、そのものずばりのコードまで書いていただいて、 大変助かりました。 ご教示頂いたコードですんなりと問題を解決することができました。 ありがとうございました。

関連するQ&A

  • 更新クエリでの抽出条件の設定がわかりません

    お世話になります。 Access2010を使っています。 今、TBL_1の社員コードの中で、期間2の日付を、TBL_2の日付フィールドの 値に置換したいです。 TBL_1はIDをオートナンバーで振っており、置換したいレコードは社員コードID値が最大の レコード内の期間2フィールドになります。TBL_2は全社員コードはなく、社員 コードがある場合のみTBL_1の期間2を置換します。 テーブル1名:TBL_1 ID 社員コード 期間1   期間2   1  00123   2012/6/30  2014/3/31 2  00123   2014/4/1   2015/3/31 3  00456   1995/9/15  2008/3/31 4  00789   2001/6/2  2013/3/31  ・ 10 00456   2008/4/1  2016/3/31  ・ 30 00789   2013/4/1  2015/3/31  ・ 50 00123   2015/4/1  2017/3/31  ・ テーブル2名:TBL_2 社員コード 日付      00123   2016/10/31  00456   2015/5/20 上の例では結果として、 IDが10のレコードの期間2を2015/5/20に置換します。 IDが50のレコードの期間2を2016/10/31に置換します。 テーブル1名:TBL_1 ID 社員コード 期間1   期間2   1  00123   2012/6/30  2014/3/31 ←変わらない 2  00123   2014/4/1   2015/3/31 ←変わらない 3  00456   1995/9/15  2008/3/31 ←変わらない 4  00789   2001/6/2  2013/3/31 ←変わらない  ・ 10 00456   2008/4/1  2015/5/20 ←期間2:2015/5/20に  ・ 30 00789   2013/4/1  2015/3/31 ←変わらない  ・ 50 00123   2015/4/1  2016/10/31 ←期間2:2016/10/31に 更新クエリを使えばいいと思っていますが、抽出条件をどのように 書いていいのかわかりません。 恐れ入りますが、宜しくお願い申し上げます。

  • ACCESS SQLのINSERTについて

    TBLというテーブルにINSERT文を使用して1行レコードを追加したいです。TBLテーブルのカラムAにはシステム日付を、カラムBには別テーブルのselect count(*)の実行結果を挿入したいのですがうまくいきません。何か良い方法はございませんでしょうか? INSERT INTO カウンタ統計 ( [DATE], USER_COUNT ) VALUES (date(), (SELECT COUNT(*) FROM hiplus_HW_USER)); ※日付は問題なく挿入できるのですがSELECT文の結果が挿入できない状況です。宜しくお願いします.

  • PostgreSqlについて

    おはようございます。 質問させてください。 テーブルのカラムにtimestamp型のフィールドがあるとします。 テーブルinsertの時に現在の時間をいれたいのですが、どのような値を入れればいいのでしょうか? test_tbl-------------- ID:INTEGER DATE:TIMESTAMP ---------------------- insert into test_tbl (ID, DATE) values (1, ****); ****の部分にnow, dateとかそんな関数はあるのでしょうか?

  • access・複数のテーブル・重複除外したデータ

    accessで複数のテーブルで重複しないレコードだけを抽出するSQL文を知りたいです。 フィールドは多数あり、「フィールドの内容が全て一致するレコード」以外のレコードを 重複しないレコードとして抽出したいと思っています。 テーブルは3つ以上ありますが、2つのテーブルで実行するSQL文でかまいません。

  • 条件をつけて日付の古い行を抜き出したい

    SQLserver2005を使っています。 下記のようなテーブルがあります。 ID 処理番号  日付   Data AA  1    2008/1/1  10 AA  1    2008/1/2  11 AA  1    2008/1/3  12 AA  2    2008/1/4  13 AB  3    2008/1/5  14 AB  3    2008/1/6  15 AB  4    2008/1/7  16 この時に「IDと処理番号が一致した場合、日付の一番古い行を抜き出す」 という条件でデータの抽出をすることは可能でしょうか 結果は下記のようになります。 ID 処理番号  日付   Data AA  1    2008/1/1  10 AA  2    2008/1/4  13 AB  3    2008/1/5  14 AB  4    2008/1/7  16 下のような命令文を作ったのですが、 「Data列」が抜き出せません。 select ID,処理番号,min(日付) from テーブルA Group by ID,処理番号 一度上の命令文でテーブルを作って元のテーブルとマッチングさせるしかないのでしょうか?出来れば一発で抜き出したいです。 ご教授宜しくお願いします。

  • VBA 抽出条件でデータ型が一致しません

    Access 2003について教えて下さい。環境はWin XPです。 Table1 ID(メモ型),日付(日付/時刻型 書式 日付(S)) 001,2012/08/10 002,2012/08/10 Form1 フォームにはテキストボックス、 txt_Dateがあります。 書式は日付(S)です。 ここには、yyyy/mm/ddの形式で値を打ち込む、またはカレンダーから選択します。 同じくボタン、btn_exeがあります。 これをクリックすると処理がはじまります。 Dim getDate As Date Dim strSQL As String Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset getDate = txt_Date.Value strSQL = "select * from Table1 where 日付 = '" & getDate & "'" objADORS.Open strSQL, objADOCON, adOpenKeyset, adLockOptimistic 質問1. where 日付 = '" & getDate & "'" でやると下記のメッセージが表示されます。 抽出条件でデータ型が一致しません where 日付 = " & getDate でやると、エラーメッセージは起こりません。 何故このようなメッセージが表示されるのでしょうか? 質問2. Table1には2012/08/10というデータが日付フィールドに存在します。 where 日付 = " & getDate ではエラーメッセージが出ないので、 次のレコードセット取得時、レコード取得件数が0件です。 条件文が上手くいっていないような気がします。なぜでしょうか? ちなみに、 strSQL = "select * from Table1 では問題なくレコードセットを取得できています。 宜しくお願いします。

  • サブクエリを利用したSQL文から複数の抽出条件

    例えば、以下のようなサブクエリを利用したSQL文があります。 SELECT table_a.* FROM table_a LEFT JOIN (SELECT table_b.* FROM table_b LEFT JOIN table_c ON (table_b.id = table_c.bid) WHERE table_b.type='1') AS tbl ON (table_a.id = tbl.aid) このSQL文にWHERE句で条件を指定したいのですが、サブクエリで指定しているtblテーブルのvalueフィールドが「1」と「20」のものを抽出したいと思います。 WHERE (tbl.value='1' AND tbl.value='20') としても結果が帰って来ません。 これは、WHEREする条件の数だけ、サブクエリでテーブルを作って条件を指定するのでしょうか? 効率が悪そうなので、他の方法があるのではと思いご質問させて頂きました。 お分かりになる方がいれば、よろしくお願いします。

  • phpmyadminで条件付きの検索置換クエリー文

    mysql初心者です。 phpmyadmin で検索と置換のクエリ文の書き方に関して質問させて頂きます、宜しくお願いいたします。 データベース: koneko_nyan テーブル: wp_postmeta フィールド:meta_id、post_id、meta_key(varchar(255))、meta_value(longtext) があります。 フィールドmeta_valueの中の"お魚"という文字列を"焼き魚"に置き換えたい。 ただし、meta_valueフィールド全体ではなくて、meta_keyフィールドに"koubutsu"という文字列が含まれている行のmeta_valueに対してだけ置き換えを実行したいと考えています。 この場合、どのようなクエリを送れば、うまく置換できるのでしょうか? 詳しい方いらっしゃいましたら、ご教示頂きたく存じます。

    • ベストアンサー
    • MySQL
  • accessvba 複数条件でFilterをしたい

    テーブル1 --------------------------------------- ID フィールド1 フィールド2 1 あ A 2 い B 3 う C 4 え D 5 お E --------------------------------------- を作成し、そのテーブルをもとに、帳票フォームを作成しました。 そのフォームに非連結のテキストボックス ID_テキスト フィールド1_テキスト フィールド2_テキスト 3つを設置しました。 行いたい事をクエリ(SQL文)で例えると、 --------------------------------------- SELECT テーブル1.ID, テーブル1.フィールド1, テーブル1.フィールド2 FROM テーブル1 WHERE (((テーブル1.ID) Like "*" & Forms!テーブル1!ID_テキスト & "*") And ((テーブル1.フィールド1) Like "*" & Forms!テーブル1!フィールド1_テキスト & "*") And ((テーブル1.フィールド2) Like "*" & Forms!テーブル1!フィールド2_テキスト & "*")); --------------------------------------- なのですが、 これをクエリを作成せずに、VBAで行いたいです。 各非連結のテキストボックスには、 更新後処理:[イベント プロシージャ] としています。 --------------------------------------- Private Sub ID_テキスト_AfterUpdate() Me.Form.Filter = _ "ID like '" & "*" & Me.ID_テキスト.Value & "*" & "'" Me.Form.FilterOn = True End Sub --------------------------------------- は、問題なくできるのですが、 Private Sub ID_テキスト_AfterUpdate() Me.Form.Filter = _ "ID like '" & "*" & Me.ID_テキスト.Value & "*" & "'" and & _ "フィールド1 like '" & "*" & Me.フィールド1_テキスト.Value & "*" & "'" Me.Form.FilterOn = True End Sub にすると、エラーになります。 andの繋げ方が良くないと思うのですが、どうすればいいでしょうか? 最終的には、 Private Sub ID_テキスト_AfterUpdate() Me.Form.Filter = _ "ID like '" & "*" & Me.ID_テキスト.Value & "*" & "'" "フィールド1 like '" & "*" & Me.フィールド1_テキスト.Value & "*" & "'" "フィールド2 like '" & "*" & Me.フィールド2_テキスト.Value & "*" & "'" Me.Form.FilterOn = True End Sub のような感じにしたいです。 ご回答よろしくお願いします。

  • レコードの更新・置換 (PLSQL)

    こんにちは。 SQLの作成で悩んでいます。 テーブル名:SAMPLE PRIMARY KEY:ID、KBN1、KBN2、CODE ID  KBN1  KBN2  CODE    POINT ---  ----  ----   -----    ------ 1   1    1     '001'    100 1   1    1     '002'    200 1   2    1     '001'    300 1   1    2     '001'    0 2   1    1     '003'    100 ・・・ というテーブルがあります。 以下の処理を行いたいのですが・・・ (1) KBN2=2のレコードのPOINTを更新(または置換)   KBN2=2は1つのIDにつき1つだけです。 (2) 更新内容は次の通りです。   ID、KBN1、CODEが(1)のレコード(KBN2=2のレコード)と同じレコードのPOINTを、(1)のレコードのPOINTに挿入。   SAMPLEテーブルのID=1ならば、4レコード目が (1,1,2,'001',100) になって欲しいのです。 UPDATE文を作成してみたのですが、Setする時のサブクエリ等の誤りで実現しません。 (全部同じポイントになってみたり・・・) 初心者の為、分かり辛い説明で大変申し訳ありませんが、ご助言頂けないでしょうか。 よろしくお願い致します。