获取自动生成键(Auto Generated Key)¶
许多数据库管理系统提供了自动生成键机制,即新插入一条记录时数据库会为新增的行自动产生一个唯一的标识,神通数据库也提供了这种机制,相应的,OSCAR JDBC驱动也提供了检索自动生成键的方法。按照 JDBC3.0规范,Statement接口新增了一个方法getGeneratedKeys,利用这个方法就可以检索出系统为新增加的行而产生的自增键值。在调用Statement对象或者PreparedStatement对象的execute、executeUpdate()的方法时,通常传递一个标识给驱动,这样在执行这些方法的时候驱动就可以决定新产生的关键字是否可供检索。
下面是一个获取自增列键值的例子:
// 创建表
String sql = "CREATE TABLE TEMP" + "(ID INT AUTO_INCREMENT PRIMARY KEY ,VALUE VARCHAR(20))";
stmt.executeUpdate(sql);
// 插入数据
sql = "INSERT INTO TEMP (VALUE) VALUES ('VALUE2')";
// 设定标志位为Statement.RETURN_GENERATED_KEYS,要求生成键返回
int rows = stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
int key = rs.getInt(1);
// 获取了自动生成键,下面进行处理
System.out.println(key);
}
stmt.close();
另外,JDK1.4还在Statement接口中提供了新的方法,供用户指定自动生成键的列名。示例如下:
String keyColumn[] = { "ROWID" };
stmt = con.createStatement();
sql = "INSERT INTO TEMP (ID,VALUE) VALUES (3,'VALUE3')";
rows = stmt.executeUpdate(sql, keyColumn);
rs = stmt.getGeneratedKeys();
当然,用户也可以指定表中已有的列名作为键的列名,甚至可以指定多个不同的列同时作为键的列名,只需要在字符串数组keyColumn[]中一一声明即可。神通数据库的ROWID列自动生成的键值,但不是自增的。
当不指定列也没有自增列(AUTO_INCREMENT)时,会返回空的结果集
最后说明一点:对于Statement对象执行的是非Insert语句的DDL语句,则系统不会产生自动生成键,所以调用Statement.getGeneratedKeys方法返回的是空结果集。