Utilização de chaves geradas automaticamente

Baixar driver JDBC

O Microsoft JDBC Driver para SQL Server suporta as APIs opcionais JDBC 3.0 para recuperar identificadores de linha gerados automaticamente. O principal valor desta funcionalidade é proporcionar uma forma de disponibilizar IDENTITY valores a uma aplicação que atualiza uma tabela de base de dados sem necessidade de uma consulta e uma segunda viagem de ida e volta ao servidor.

Como o SQL Server não suporta pseudocolunas para identificadores, as atualizações que utilizam a funcionalidade de chave gerada automaticamente devem operar contra uma tabela que contenha uma IDENTITY coluna. O SQL Server permite apenas uma IDENTITY coluna por tabela. O conjunto de resultados devolvido pelo método getGeneratedKeys da classe SQLServerStatement tem apenas uma coluna, com o nome GENERATED_KEYSda coluna . A partir do Driver JDBC 13.6, se forem solicitadas chaves geradas para uma instrução que não gera um IDENTITY valor, o driver devolve um conjunto de resultados vazio e não nulo e ResultSet.next() devolve false.

Como exemplo, crie a seguinte tabela na base de dados de exemplo AdventureWorks2025:

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

No exemplo seguinte, uma ligação aberta à base de dados de exemplo do AdventureWorks2025 é passada para a função, é construída uma instrução SQL que adiciona dados à tabela, e depois a instrução é executada e o IDENTITY valor da coluna é exibido.

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