这个问题已经有一个答案在这里:

是否有某种方式获得的价值从最后插入行的?

我插入一个行PK将自动增加,并且我希望得到这一PK。只有PK保证是唯一的表中。

我用爪哇有JDBC和PostgreSQL。

有帮助吗?

解决方案

与PostgreSQL您可以做它通过返回的关键词:

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);

其他提示

看到API文档 java。sql。声明.

基本上,当你打电话 executeUpdate()executeQuery(), 使用 Statement.RETURN_GENERATED_KEYS 恒定。然后你可以叫 getGeneratedKeys 得到自动生成密钥的所有行创建的通过,执行。(假设你JDBC驱动程序提供。)

它会沿线的东西:

Statement stmt = conn.createStatement();
stmt.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keyset = stmt.getGeneratedKeys();

如果你使用JDBC3.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);
}

由于PostgreSQL JDBC驱动的版本 8.4-701PreparedStatement#getGeneratedKeys() 终于完全的功能。我们在这里使用它几乎一年中生产到我们的完全满意。

在"普通JDBC"的 PreparedStatement 需要创建了如下,以使它返回键:

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

你可以下载的电流JDBC驱动的版本 在这里, (这是在目前仍然8.4-701).

的序列在postgresql是交易的安全。所以你可以用的

currval(sequence)

引用:

currval

返回的价值最近获得通过nextval为这个序列 在本届会议。(错误 报告如果nextval从来没有 呼吁这个顺序在这 会议。) 请注意,因为这是 回来一会-当地的价值, 给出了一个可预测,即使回答 其他会议执行nextval 同时。

这里是我怎么得到解决,基于答案在这里:

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));
        }

如果您使用 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);

使用的序列postgres id列:

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

SELECT currval('MySequence');

currval将返回的当前值中的顺序相同的会议。

(MS SQL,你会使用@@身份或SCOPE_IDENTITY())

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();

不使用选择currval('MySequence')-的价值得到增加对插入该失败。

终3.0.4有注解和Postgresql驱动9.0-801.jdbc4定义的界面方法,在你的映像

public interface ObjectiveMapper {

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

注意@选择使用,而不是@插入。

例如:

 Connection conn = null;
            PreparedStatement sth = null;
            ResultSet rs =null;
            try {
                conn = delegate.getConnection();
                sth = conn.prepareStatement(INSERT_SQL);
                sth.setString(1, pais.getNombre());
                sth.executeUpdate();
                rs=sth.getGeneratedKeys();
                if(rs.next()){
                    Integer id = (Integer) rs.getInt(1);
                    pais.setId(id);
                }
            } 

,Statement.RETURN_GENERATED_KEYS);" 没有找到。

使用这一简单的代码:

// 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)

如果你是在交易可以使用 SELECT lastval() 之后插入以得到的最后一生的身份证。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top