• ベストアンサー

JAVAでテーブルの中身を見て、処理を分岐させるには

JAVA初心者です。 JAVAで、ファイルから読み込んだデータをMySQLのテーブルに格納したいのですが、 すでにテーブルにある(キーが同じ)ならば、updateをし、 テーブル内同じキーのものがなければ、insertをしたいのですが、分岐条件の部分をどうやってかいたらよいのかわからず、上手くかけません。 select count(*) from table where key=00000; を使うのかなと思うのですが、 どうやって書いたらいいのかわかりません。 どなたか教えてください!

  • Java
  • 回答数5
  • ありがとう数6

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

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

質問の内容から察するにJDBCの基礎がわかってる上での質問だと思っていたのですが、そうではなかったようで・・・。 >の「抽出結果」に値を格納する方法がわかれば、 >教えていただきたいのですが。。 この方法については他の回答者さんの回答どおりです。 JavaでDBをいじくる時に使うAPIの名前をJDBCって言います。 まずはSpiralGalaxyさんが提示しておられるサイトでJDBCがどんな物かを体験してみるのが手っ取り早いかと。 さらに「JDBC mysql」等のワードでググってみることをお勧めします。

pomtasuke
質問者

お礼

親切にたびたびの回答をありがとうございました。 おれいが遅くなり大変もうしわけありませんでした。 なんとか実行することができるようになりました。 JDBCについて知識不足で、せっかくの回答をすぐに生かすことができませんでしたが、これからもがんばろうと思います。

その他の回答 (4)

回答No.5

insert処理を実行し、一意制約エラーの場合にのみ、updateをしてはどうでしょうか? 例えば、こんな感じです。 try {   INSERT処理 } catch(SQLException e) if (一意制約のエラー) { UPDATE処理 } else { throw e; }  }

pomtasuke
質問者

お礼

お礼が大変おそくなりましたが、 ありがとうございました。 教えてくださったように実行することができました。

回答No.3

JavaとSQLがごっちゃになってます。 >select count(*) from table where key=00000; これはSQL言語です。 Javaのコードではありませんので、コンパイルできません。 以下のサイトあたりを参考にすれば、いいでしょう。 http://www.hellohiro.com/jdbcmysql.htm

pomtasuke
質問者

お礼

JAVAとSQL、なにがなにだかわかりませんでしたが、 教えていただいたURLも参考にしながら、なんとか実行にこぎつけました。 お礼がほんじつまで遅くなってしまい、失礼いたしました。本当にありがとうございました。

回答No.2

前提としてコネクション、ステートメントは取得していますでしょうか? (1)SQLの結果はResultSetに格納します。 ResultSet rs = state.executeQuery("select count(*) from table where key=00000"); ※stateはStatementのインスタンス (2)上記の実行SQLでカウント結果を参照するには以下のような書き方になります。 int i = rs.getInt(1); (3)上記で得た結果を比較して次処理に移ってください。

pomtasuke
質問者

お礼

ありがとうございました。 まったくわからない状態でしつもんしてしまい、すぐに アドバイスいただいたことを反映することができなかったのですが、その後勉強しなおし、実行することができました。 ほんとうにありがとうございました。

回答No.1

件数が1件限定ならば select count(*) from table where key=00000 if (抽出結果=0) { INSERT処理 } else { UPDATE処理 } でいけると思います。 複数件だったら ・対象テーブルのキーをMapあたりに放り込んどいて ・読み込んだファイルのキーとぶつけて ・キーの有無でINSERT OR UPDATEの処理 って感じで私はやります。 バッチステートメントも必ず使用しますね。 あとはPL/SQL使ってやっちゃうとか。 他の人ってこういうの処理する時はどうしてるんでしょうね? いろんな意見が聞きたいです。

pomtasuke
質問者

お礼

さっそくの回答ありがとうございます。 >select count(*) from table where key=00000 >if (抽出結果=0) { >INSERT処理 >} >else { >UPDATE処理 >} の「抽出結果」に値を格納する方法がわかれば、 教えていただきたいのですが。。 a = select count(*) from table where key=00000 if(a = 0 ){…… というふうに単純に書いてもだめだったので。。

関連するQ&A

  • VBでSQL

    SQLでテーブル1に該当レコードがなければインサート あればアップデートをする処理をしたいのです IF ??? THEN UPDATE テーブル1 SET SELECT * FROM テーブル2 WHERE 条件 ELSE INSERT INTO テーブル1(SELECT * FROM テーブル2) END IF ???はプライマリキーで判定をしようと考えています こんな感じでやろうとしたところ うまくいきませんでした VB上で実行しよううとしているからなのでしょうか? ADOでSQLサーバに接続しています 条件分岐もどういう条件(VBでの書き方)がわからないです。 よろしくお願いします。

  • 2つのテーブルの結合に関してです

    お世話になります PHP5,MySql5.0.33にて開発を行っています 2つのテーブルの結合部分で困っています TABLE1 ---------------------------------- ID DATE1 DATE2  COUNT ---------------------------------- 1  2/27  2/20  10 2  2/27  2/20  10 ---------------------------------- TABLE2 ---------------------------------- ID DATE1 DATE2 COUNT ---------------------------------- 1  2/21  2/26  5 2  2/21  2/27  5 ---------------------------------- 上記2つのテーブル(TABLE1/TABLE2)から TABLE1のDATE1=2/27より過去の行とTABLE2のDATE2=2/27より過去の行を 取得したいのですが上手くいかず…(下SQLで記述しています) SELECT DISTINCT TABLE1.* FROM TABLE1,TABLE2 WHERE TABLE1.ID=TABLE2.ID AND TABLE1.ID=1 AND (TABLE1.DATE1<='2009/2/27' OR TABLE2.DATE2<='2009/2/27') (結合のそもそもの理解が間違っているかも知れませんが…;) 宜しくお願いします

    • ベストアンサー
    • MySQL
  • 同じテーブルでのUNION

    テーブルtableである列aのデータが1,2,3,4,5,6,7,8,9と 入っていたとします。 このテーブルを1,2,5,3,4,6,7,8,9という順番で SELECTしたい場合はどのようにすればよろしいでしょうか? select a from table where a IN (1,2) union select a from table where a = 5 union select a from table where a NOT IN (1,2,5) としてみたのですが1,2,3,4,5,6,7,8,9と表示されてしまいます。 宜しくお願いいたします。

  • 複雑なcountについて

    val | num ----------- 9984 | 1 1234 | 1 9876 | 1 4567 | 1 9984 | 1 1234 | 1 9984 | 1 以上のようなテーブルで SELECT COUNT(*) FROM table_name WHERE val = 9984 SELECT COUNT(*) FROM table_name WHERE val = 1234 SELECT COUNT(*) FROM table_name WHERE val = 9876 SELECT COUNT(*) FROM table_name WHERE val = 4567 のように4つ実行することなく1度に 9984 => 3 1234 => 2 9876 => 1 4567 => 1 という結果を得たいのですが方法はありますでしょうか? ご教示お願いいたします。

  • SELECT文の二段重ね

    次のSQL文を実行します。 create table1 (id, english) insert table1 (1,"foo") insert table1 (2,"bar") create table2 (id, japanese) insert table2 (1, "ふー") insert table2 (2, "ばー") SQL文法としては誤ってますが、成功したとします。 いま、select id from table1 where english = 'foo'; で1が得られます。 いま、select japanese from table2 where id = 1; で"ふー"が得られます。 これを一つのSQLite3のselect文で実現できないでしょうか。 select japanese from table2 where id = (select id from table1 where english = 'foo'); で良いですか? カテゴリ選択にSQLiteが無いのは、人気が無いからですかね。

  • 複数(2つ)のテーブルで検索を行いたい

    MySQL 3.23です。 select count(*) as hit from freedata where (A=10 or B=10); という構文と select count(*) as hit from sharedata where A=10; という構文を一行にしたOR検索を行いたいのですが、方法はありますか? 要は、同一のキーワードで、二つのテーブルを検索対象にしたいのです。ご教授よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 作成したテーブルが存在していないように扱われる

    create table 発明者 (id int); とし, show tables; としても,テーブルはないと言われますが(ほかにテーブルがないので) select count(*) from 発明者; などとすると count (*) 0 と返ってきます. この例は現象確認のための作りましたが, テーブル名は同じです. mysqlのバージョンは5.0.41です. お心当たりのある方,アドバイス賜れば幸いです. よろしくお願いいたします.

    • ベストアンサー
    • MySQL
  • 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
  • mysql のテーブルロックについて

    Mysqlにてテーブルをロックしようとして以下2つの方法を試し疑問に思ったので質問します。 1.select for update によるテーブルロック 以下のselect for update(where句にレコードを一意に特定できない条件を指定) をコマンドライン で実行。 select * from test where test_state=0 for update; 別に起動したコマンドラインから下記アップデート文を実行したところ ロックされることが確認できました。 update test set test_official=0 where test_id = 1; しかし、最初に実行した select for update 文を下記のようにしたところ上記update文はロックされず に実行されてしまいました。 select * from test where test_state is null for update; これはなぜでしょうか。

    • ベストアンサー
    • MySQL
  • 一定以上の行があれば最大値を持つ行を削除するSQL

    MySQL5にて、あるテーブルの特定フィールドの数(つまりcount値)が一定値以上であれば、間引きのため別のフィールドの値で最大値をもつ行を削除するSQLを考案中です。 イメージとしては以下の通りですが、SQLとしては誤っており、また、冗長です。 DELETE FROM table WHERE id={$id} AND (SELECT COUNT(*) FROM table WHERE id={$id}) > 5 AND begin = (SELECT MAX(begin) FROM table WHERE id={$id}); よい知恵をお授けください。

    • ベストアンサー
    • MySQL

専門家に質問してみよう