我已经实现了一个自动递增PK的触发器和序列,我使用的是Oracle 10g作为数据库。 现在我想使用JAVA插入一些东西,但我需要在INSERT之后立即将增加的PK保存在变量中。我试过这个:
PreparedStatement pstmt = connection.prepareStatement("INSERT INTO sometable
VALUES(?, ?)",
Statement.RETURN_GENERATED_KEYS);
pstmt.setInt(1, 5);
pstmt.setString(2, "Username");
pstmt.executeUpdate();
ResultSet resultSet = pstmt.getGeneratedKeys();
但它不起作用。
答案 0 :(得分:1)
您需要指定要检索的可能生成的密钥。
PreparedStatement pstmt = conn.prepareStatement(sql,new String [] {"ID_ORDER"});
请注意,列名称区分大小写。最后需要JDBC 3.0驱动程序和Oracle 10g R2或更高版本。
您可以通过检查DatabaseMetaData:
来检查当前安装是否支持此机制DatabaseMetaData metaData = conn.getMetaData();
log("SupportsGetGeneratedKeys?="+metaData.supportsGetGeneratedKeys());
答案 1 :(得分:0)
customer.getID()
是表的候选键吗?如果是这样,您可以在SELECT
之后运行INSERT
以查找生成的PK的值。或者,您可以摆脱触发器,从Java中的DB获取SEQUENCE
的下一个值,并将其用作INSERT
的PK。这种方法的缺点是来自其他应用程序的插入也必须这样做。