- - PR -
Postgres挿入時のserial値の取得
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2009-02-02 20:43
Postgre8.2 Java1.5で開発をしています。
テーブルに値を挿入したときに、select currval(serial_col) というような クエリーや8.2以降であればreturning句を使えば、serialカラムの値が挿入と 同時に取得できるということは調べたのですが、具体的にソースにおとすときに は、どのように書いたらいいのか分からず困っております。 テーブルは CREATE TABLE user_ ( user_id serial NOT NULL, user_name character varying(100), login_name character varying(50), pswd bytea ) というようなテーブルで、 以下のような形でSQL文を組み立てて実行してみたのですがうまくいきません。 どこか参考になるようなサイト等を教えていただければ幸いです。 よろしくお願いいたします。 String query = "insert into user_ (user_name) values('test') returning (user_id)"; PreparedStatement pstmt = con.prepareStatement(query,PreparedStatement.RETURN_GENERATED_KEYS); int test = pstmt.executeUpdate(); rs = pstmt.getGeneratedKeys(); while(rs.next()){ System.out.println(rs.getInt(1)); } |
|
投稿日時: 2009-02-03 10:50
やったことがあるわけじゃないので、推測ですが
SQLの実行結果として値が帰るのであれば ps.executeQuery()を使えばいいのではないでしょうか? 逆にこれがダメだとJDBCでは扱えないのではないかと思います。 |
|
投稿日時: 2009-02-03 13:35
currval()以外にも、nextval()という関数があるので、それを使用する感じになるのではないかと思います。
# が、ものによって、もしくはデータベースドライバなどによって、インサートしたidを勝手に取得して返したりする関数が実装されてたりする場合があったような・・・ |
|
投稿日時: 2009-02-03 23:37
returningを使うのであれば、sawat様のおっしゃるとおりexecuteQuery()してResultSetを取得すれば良いように思います。(私は使ったことありません)
下のURLはreturningの解説みたいです。 http://www.hoge256.net/2008/04/120.html また、nextval()でinsertしてcurrval()で取り出す方法もあります。(これは使ったことあります) この方法ですと2本のSQLを発行することになります。 たしか、同一トランザクション内でなければ駄目だったような気もします。 下記参考URLです。 http://blog.ozacc.com/archives/001613.html ご参考になれば幸いです。 |
|
投稿日時: 2009-02-04 19:05
ご回答ありがとうございました。
ご指摘の通り、executeQuery()を使ってResultSetを取得することにより、目的のserial値を取り出すことができました。 ご参考までに、ソースは String query = "insert into user_ (user_name) values('abc') returning(user_id)"; getConnection2Postgres(); try { PreparedStatement pstmt = con.prepareStatement(query); ResultSet rs = pstmt.executeQuery(); while(rs.next()){ System.out.println(rs.getInt(1)); ← serial_idを取得 } catch(SQLException e){ e.printStackTrace(); } です。 |
1