INSERT и получить автоматически увеличивающееся значение

Рассмотрим следующую таблицу:

create table language (
    id integer generated always as identity (START WITH 1, INCREMENT BY 1),
    name long varchar,
    constraint language_pk primary key (id)
);

К которому я бы вставил запись таким образом.

insert into language(name) values ('value');

Как узнать, какое значение для id было создано? Простое выполнение SELECT с использованием поля name недопустимо, поскольку могут быть повторяющиеся записи.


person deprecated    schedule 22.07.2011    source источник
comment
Я знаю, что в Firebird вы можете использовать Returning ID, чтобы он вставлял и возвращал новое значение для столбца. У других должно быть что-то подобное, хотя лично я не знаком с Дерби.   -  person g.d.d.c    schedule 22.07.2011
comment
Я использую Derby / Java DB, как описано в тегах   -  person deprecated    schedule 22.07.2011
comment
Ни один из этих ответов, похоже, не решает эту конкретную проблему.   -  person deprecated    schedule 22.07.2011


Ответы (3)


Через простой SQL:

 insert into language(name) values ('value');
 SELECT IDENTITY_VAL_LOCAL();

Подробнее см. В руководстве: http://db.apache.org/derby/docs/10.7/ref/rrefidentityvallocal.html

При выполнении этого из класса Java (через JDBC) вы можете использовать getGeneratedKeys () после" запроса "их с помощью approriate executeUpdate ().

person a_horse_with_no_name    schedule 22.07.2011
comment
Ваш ответ в этой stackoverflow.com/questions/4894754/ - person deprecated; 22.07.2011

Вы используете метод JDBC

st.execute(sql, Statement.RETURN_GENERATED_KEYS);
ResultSet keys = st.getGeneratedKeys();

как описано в руководстве по Derby.

См. Также Javadocs: DatabaseMetaData # supportsGetGeneratedK () и Заявление # getGeneratedKeys ()

person eckes    schedule 09.08.2014

Вы можете выполнить этот оператор (NB, не уверен на 100%, что этот синтаксис верен для Derby:

SELECT TOP 1 id FROM language ORDER BY id DESC

Чтобы найти последний вставленный идентификатор.

Альтернатива Дерби:

SELECT MAX(id) from language

Очевидно, это будет точным только в том случае, если между вашей вставкой и выбором не было никаких других вставок (включая вставки других пользователей).

См. Также это обсуждение:

person xan    schedule 22.07.2011
comment
Небезопасно в многопользовательской среде - если два пользователя добавляют запись одновременно, вы можете вернуть неверный идентификатор. - person ain; 22.07.2011
comment
@ain: Именно так, как я говорю в ответе. - person xan; 22.07.2011
comment
Это подойдет для моей конкретной программы (спасибо!), Но интересно, что говорит @ain - person deprecated; 22.07.2011
comment
@xan Ну что, добавили / отредактировали после моего комментария? Когда я писал свой комментарий, его там не было ... - person ain; 22.07.2011
comment
Мой комментарий к другим вставкам, влияющим на возвращаемый вам идентификатор, был там с самого начала. Прочитав ваш комментарий, я добавил конкретное примечание о других пользователях, взаимодействующих с таблицей, поскольку это очень верный момент. - person xan; 22.07.2011