Generated Keys

Базовый Java
≈ 1 мин чтения

Иногда часть новой строки создаёт сама база

При вставке записи приложение может не знать её будущий идентификатор. Например, значение id генерируется последовательностью или identity-механизмом базы. После INSERT этот ключ часто нужен сразу: чтобы вернуть его клиенту или использовать в следующей связанной записи.

Просим JDBC вернуть сгенерированные значения

String sql = "INSERT INTO users(name) VALUES (?)";

try (PreparedStatement statement = connection.prepareStatement(
        sql, Statement.RETURN_GENERATED_KEYS)) {

    statement.setString(1, "Mila");
    statement.executeUpdate();

    try (ResultSet keys = statement.getGeneratedKeys()) {
        if (keys.next()) {
            long id = keys.getLong(1);
            System.out.println(id);
        }
    }
}

Флаг Statement.RETURN_GENERATED_KEYS сообщает драйверу, что после выполнения понадобятся созданные базой ключи. Затем getGeneratedKeys() возвращает их как обычный ResultSet.

Конкретный результат зависит от базы и драйвера

JDBC задаёт API получения ключей, но механизм их генерации относится к конкретной СУБД. Поэтому не стоит предполагать, что любая команда и любой драйвер вернут одинаковый набор значений. Если приложению важны конкретные столбцы, учитывай возможности выбранной базы и драйвера.

Не ищи только что вставленную строку отдельным SELECT ради её id. Если база и драйвер поддерживают generated keys, получение ключа через тот же INSERT обычно точнее и проще.