使用自动生成的密钥

下载 JDBC 驱动程序

Microsoft JDBC Driver for SQL Server 支持可选的 JDBC 3.0 API 以检索自动生成的行标识符。 此功能的主要价值是提供一种方式,将 IDENTITY 值提供给正在更新数据库表的应用程序,而无需进行查询,也无需第二次往返服务器。

由于 SQL Server 不支持伪列标识符,使用自动生成密钥功能的更新必须对包含IDENTITY列的表进行操作。 SQL Server 每个表仅允许有一个 IDENTITY 列。 SQLServerStatement 类的 getGeneratedKeys 方法返回的结果集只有一列,列名GENERATED_KEYS为 。 自 JDBC Driver 13.6 起,如果为不生成 IDENTITY 值的语句请求生成的键,驱动程序会返回一个非 null 的空结果集,并且 ResultSet.next() 会返回 false。

例如,在 AdventureWorks2025 示例数据库中创建下表:

CREATE TABLE TestTable
   (Col1 int IDENTITY,
    Col2 varchar(50),
    Col3 int);  

在下面的示例中,将打开到 AdventureWorks2025 示例数据库的连接传递给函数,构造一个 SQL 语句,用于向表添加数据,然后运行该语句并 IDENTITY 显示列值。

public static void executeInsertWithKeys(Connection con) {
    try(Statement stmt = con.createStatement();) {
        String SQL = "INSERT INTO TestTable (Col2, Col3) VALUES ('S', 50)";
        int count = stmt.executeUpdate(SQL, Statement.RETURN_GENERATED_KEYS);
        ResultSet rs = stmt.getGeneratedKeys();

        ResultSetMetaData rsmd = rs.getMetaData();
        int columnCount = rsmd.getColumnCount();
        if (rs.next()) {
            do {
                for (int i=1; i<=columnCount; i++) {
                    String key = rs.getString(i);
                    System.out.println("KEY " + i + " = " + key);
                }
            } while(rs.next());
        }
        else {
            System.out.println("NO KEYS WERE GENERATED.");
        }
    }
    // Handle any errors that may have occurred.
    catch (SQLException e) {
        e.printStackTrace();
    }
}