使用JAVA和SQL:插入命令的返回值是什么?

5

我是一名有用的助手,可以为您进行文本翻译。

我有一个作者表:authorID,authorName。其中authorID是自增主键。

我想编写一个Java方法,从用户那里获取一个姓名并将其添加到表中。但是我需要返回作者的ID。有没有一种方法可以使用1个SQL语句来完成这个任务?

例如,如果我的代码有以下命令:

stmt.executeUpdate("INSERT INTO authors " + "VALUES (, '"+ string.get(1) +"')");

其中string.get(1)是作者姓名。

现在,如果我写:

ResultSet rs =stmt.executeUpdate("INSERT INTO authors " + "VALUES (, '"+ string.get(1) +"')");

出现错误,提示rs是结果集,但返回值是int类型。这个int类型是否是我插入的行的主键?


不,它是根据您的查询修改的行数。主键并不总是单个整数,你知道的。 - Gimby
int 表示受影响的行数,如果您执行了一个插入操作,则 int 将为 1。 - amicngh
5
string.get(1)来自哪里?记得心中要想着小博比的嵌入式SQL攻击 - jlordo
好的,谢谢。但是我还不知道是否能够使用一个sql语句插入行并获取其主键? - jeff ranz
你可以。我下面发布的代码是有效的。 - Andrew
你可以很容易地自行查找 - Marko Topolnik
5个回答

10

尝试

stmt.executeUpdate("INSERT INTO authors VALUES (, '"+ string.get(1) +"')", Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
rs.next();
long pk = rs.getLong(1);

谢谢!这个工作就像魔法一样。唯一的不同是第一个参数应该是null,像这样:VALUES(null,'"+ string.get(1) +"') - jeff ranz
2
最好的做法是,原帖作者应该使用参数化查询。 - Mark Rotteveel
4
请使用参数化查询。当前的代码存在SQL注入攻击的风险。请注意不改变原意并尽量通俗易懂。 - Andrew
如果stmt.getGeneratedKeys()抛出SQLException,如何删除插入的记录? - Swapnil Gangrade

5
为了获取最后插入的id,请看下面的代码:
PreparedStatement stmnt = Conn.preparedStatement("INSERT INTO authors(col1) VALUES (?)", Statement. RETURN_GENERATED_KEYS );
stmnt.setString(col1val);
stmnt.executeUpdate();
ResultSet rs=stmnt.getGeneratedKeys();
if(rs.next()){
   System.out.println(rs.getInt(1));
}

5

在创建PreparedStatement时,可以使用Statement.RETURN_GENERATED_KEYS参数。例如:conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

之后,使用PreparedStatement#getGeneratedKeys()可以获取插入后生成的自增长主键。


如果 SQL 失败,比如说 SQL 查询语句错误,它会返回什么? - Sajib Acharya
在这种情况下,它会抛出 SQL 异常。更多文档请参见此处:https://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#getGeneratedKeys() - Subhrajyoti Majumder

0

我不确定JDBC是否支持这个(我已经有一段时间没有使用它了),但我猜你可以尝试一下:

INSERT INTO TABLE_NAME (FIELD1, FIELD2) VALUES ('foo', 'bar') RETURNING FIELD3

通过 executeQuery() 或者,如果你的 JDBC 驱动不支持 RETURNING,可以编写一个简单的存储函数。

你使用的是哪个 RDBMS?


0

尝试:

INSERT INTO authors VALUES (...) returning authorID

执行时,请使用executeQuery。您应该收到一个带有一行和一列的ResultSet — 这将是ID。


ResultSet rs = stmt.executeUpdate("INSERT INTO authors " + "VALUES (, '"+ string.get(1) +"' returning authorID)");无法工作。 - jeff ranz
@jeffranz 使用 executeQuery。 - BigMike
1
...并将闭合括号从authorID之后移动到returning之前。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接