Obtener claves autogeneradas en una consulta

written by uve 3 May 2010

Supongamos la siguiente situación. Tenemos una tabla en la que la clave primaria es un identificador auto incremental. En mi caso,utilizando MySQL ( por obligación :), la tabla sería la siguiente:

CREATE TABLE `tableName`
(
    `id` INT NOT NULL auto_increment,
    `name` VARCHAR(20),
    PRIMARY KEY(`id`)
);

El problema es independiente del Sistema Gestor de Bases de Datos (SGBD) ya que estoy trabajando a través de JDBC, pero la creación de la tabla si puede diferir en función del que se esté utilizando.

Ahora realizamos una nueva inserción, pero ¿cuál es el identificador que el SGBD ha asignado a la tupla?

Una de las formas de realizar una inserción es la siguiente:

import java.sql.Connection;
import java.sql.Statement;

// Creamos la conexión y preparamos el Statement
Connection conn = ...;
Statement stmt = conn.createStatement();
// Preparamos la consulta
String name = "uve";
stmt.executeUpdate("INSERT INTO tableName (name) VALUES (" + name + ")");

Para poder recuperar el identificador asignado, podemos realizar el siguiente cambio:

import java.sql.Connection;
import java.sql.Statement;

// Creamos la conexión y preparamos el Statement
Connection conn = ...;
Statement stmt = conn.createStatement();
// Preparamos la consulta
String name = "uve";
stmt.executeUpdate("INSERT INTO tableName (name) VALUES (" + name + ")", Statement.RETURN_GENERATED_KEYS);

// Obtenemos la clave
ResultSet res = stmt.getGeneratedKeys();
res.next();
int idInsercion = res.getInt(1);

Si en lugar de esto estamos utilizando PreparedStatement, la obtención del id es idéntica. Veamos un ejemplo:

import java.sql.Connection;
import java.sql.Statement;
import java.sql.PreparedStatement;

// Creamos la conexión y preparamos el Statement
Connection conn = ...;
String insert = "INSERT INTO tableName (name) VALUES (?)";
PreparedStatement ps = conn.prepareStatement(insert, Statement.RETURN_GENERATED_KEYS);
// Preparamos la consulta
String name = "uve";
ps.setString(1, name);
ps.executeUpdate();

// Obtenemos la clave
ResultSet res = ps.getGeneratedKeys();
res.next();
int idInsercion = res.getInt(1);

Y con esto, todo listo.

Tags

La teoría es cuando crees saber algo, pero no funciona.
La práctica es cuando algo funciona, pero no sabes por qué.
Los programadores combinan la teoría y la práctica:
Nada funciona y no saben por qué.