59

最後に挿入された行から値を取得する方法はありますか?

PKが自動的に増加する行を挿入していますが、このPKを取得したいと思います。PKのみがテーブル内で一意であることが保証されています。

JDBCとPostgreSQLでJavaを使用しています。

4

14 に答える 14

66

PostgreSQL では、RETURNING キーワードを使用して実行できます。

PostgresSQL - 戻る

INSERT INTO mytable( field_1, field_2,... )
VALUES ( value_1, value_2 ) RETURNING anyfield

「anyfield」の値を返します。「anyfield」はシーケンスであってもなくてもかまいません。

JDBC で使用するには、次のようにします。

ResultSet rs = statement.executeQuery("INSERT ... RETURNING ID");
rs.next();
rs.getInt(1);
于 2008-10-27T20:13:00.907 に答える
28

java.sql.Statementの API ドキュメントを参照してください。

基本的に、executeUpdate()またはを呼び出すときは、定数executeQuery()を使用します。Statement.RETURN_GENERATED_KEYSその後、呼び出しgetGeneratedKeysて、その実行によって作成されたすべての行の自動生成キーを取得できます。(JDBC ドライバーがそれを提供すると仮定します。)

これは次のようになります。

Statement stmt = conn.createStatement();
stmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keyset = stmt.getGeneratedKeys();
于 2008-10-27T21:02:10.307 に答える
16

JDBC 3.0 を使用している場合は、挿入するとすぐに PK の値を取得できます。

方法について説明している記事は次のとおりです。https://www.ibm.com/developerworks/java/library/j-jdbcnew/

Statement stmt = conn.createStatement();
// Obtain the generated key that results from the query.
stmt.executeUpdate("INSERT INTO authors " +
                   "(first_name, last_name) " +
                   "VALUES ('George', 'Orwell')",
                   Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if ( rs.next() ) {
    // Retrieve the auto generated key(s).
    int key = rs.getInt(1);
}
于 2008-10-27T22:18:33.650 に答える
13

PostgreSQL JDBC ドライバー バージョン8.4-701以降、PreparedStatement#getGeneratedKeys()ついに完全に機能するようになりました。ここでは、ほぼ 1 年間、完全に満足するまで使用しています。

「プレーンな JDBC」ではPreparedStatement、キーを返すようにするには、次のように作成する必要があります。

statement = connection.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);

ここから現在の JDBC ドライバーのバージョンをダウンロードできます(現時点ではまだ 8.4-701 です)。

于 2010-06-01T21:28:50.107 に答える
8

postgresqlのシーケンスはトランザクションセーフです。だからあなたは使用することができます

currval(sequence)

引用:

currval

現在のセッションでこのシーケンスのnextvalによって最後に取得された値を返します。(このセッションでこのシーケンスに対してnextvalが呼び出されたことがない場合は、エラーが報告されます。)これはセッションローカル値を返すため、他のセッションがその間にnextvalを実行している場合でも、予測可能な回答が得られることに注意してください。

于 2008-10-27T18:44:59.447 に答える
7

ここでの回答に基づいて、私がそれを解決した方法は次のとおりです。

Connection conn = ConnectToDB(); //ConnectToDB establishes a connection to the database.
String sql = "INSERT INTO \"TableName\"" +
        "(\"Column1\", \"Column2\",\"Column3\",\"Column4\")" +
        "VALUES ('value1',value2, 'value3', 'value4') RETURNING 
         \"TableName\".\"TableId\"";
PreparedStatement prpState = conn.prepareStatement(sql);
ResultSet rs = prpState.executeQuery();
if(rs.next()){
      System.out.println(rs.getInt(1));
        }
于 2008-10-28T11:32:48.240 に答える
4

を使用している場合はStatement、次の手順に進みます

//MY_NUMBER is the column name in the database 
String generatedColumns[] = {"MY_NUMBER"};
Statement stmt = conn.createStatement();

//String sql holds the insert query
stmt.executeUpdate(sql, generatedColumns);

ResultSet rs = stmt.getGeneratedKeys();

// The generated id

if(rs.next())
long key = rs.getLong(1);

を使用している場合はPreparedStatement、次の手順に進みます

String generatedColumns[] = {"MY_NUMBER"};
PreparedStatement pstmt = conn.prepareStatement(sql,generatedColumns);
pstmt.setString(1, "qwerty");

pstmt.execute();
ResultSet rs = pstmt.getGeneratedKeys();
if(rs.next())
long key = rs.getLong(1);
于 2013-05-01T14:23:38.957 に答える
1

id列のpostgresでシーケンスを使用します。

INSERT mytable(myid) VALUES (nextval('MySequence'));

SELECT currval('MySequence');

currvalは、同じセッション内のシーケンスの現在の値を返します。

(MS SQLでは、@@ IDまたはSCOPE_IDENTITY()を使用します)

于 2008-10-27T18:47:33.997 に答える
1
PreparedStatement stmt = getConnection(PROJECTDB + 2)
    .prepareStatement("INSERT INTO fonts (font_size) VALUES(?) RETURNING fonts.*");
stmt.setString(1, "986");
ResultSet res = stmt.executeQuery();
while (res.next()) {
    System.out.println("Generated key: " + res.getLong(1));
    System.out.println("Generated key: " + res.getInt(2));
    System.out.println("Generated key: " + res.getInt(3));
}
stmt.close();
于 2011-01-07T08:45:03.177 に答える
0

SELECT currval('MySequence')は使用しないでください。失敗した挿入では値が増分されます。

于 2010-05-25T20:22:10.800 に答える
0

トランザクションを使用している場合はSELECT lastval()、挿入後に使用して、最後に生成された ID を取得できます。

于 2014-04-03T08:32:40.017 に答える
0

その単純なコードを使用します。

// Do your insert code

myDataBase.execSQL("INSERT INTO TABLE_NAME (FIELD_NAME1,FIELD_NAME2,...)VALUES (VALUE1,VALUE2,...)");

// Use the sqlite function "last_insert_rowid"

Cursor last_id_inserted = yourBD.rawQuery("SELECT last_insert_rowid()", null);

// Retrieve data from cursor.

last_id_inserted.moveToFirst(); // Don't forget that!

ultimo_id = last_id_inserted.getLong(0);  // For Java, the result is returned on Long type  (64)
于 2012-06-28T12:36:22.147 に答える
0

Annotations と Postgresql ドライバー 9.0-801.jdbc4 を使用する MyBatis 3.0.4 の場合、次のように Mapper でインターフェイス メソッドを定義します。

public interface ObjectiveMapper {

@Select("insert into objectives" +
        " (code,title,description) values" +
        " (#{code}, #{title}, #{description}) returning id")
int insert(Objective anObjective);

@Insert の代わりに @Select が使用されることに注意してください。

于 2011-04-16T20:28:25.833 に答える
0

例えば:

接続接続 = null;
            PreparedStatement sth = null;
            ResultSet rs =null;
            試す {
                conn = delegate.getConnection();
                sth = conn.prepareStatement(INSERT_SQL);
                sth.setString(1, pais.getNombre());
                sth.executeUpdate();
                rs=sth.getGeneratedKeys();
                if(rs.next()){
                    整数 ID = (整数) rs.getInt(1);
                    pais.setId(id);
                }
            }

,Statement.RETURN_GENERATED_KEYS);"見つかりませんでした。

于 2011-05-31T02:59:10.570 に答える