Как получить значение счётчика id (auto_increment) из базы данных?

Рейтинг: 1Ответов: 3Опубликовано: 14.06.2011

Возможно ли получить текущее значение счётчика id (auto_increment) - одна из колонок в таблице базы данных.

  1. Используется JDBC
  2. БД на всякий случай H2 (embedded)
  3. Язык программирования Java

Интересует именно значение счётчика (оно отображает реальное количество добавленных записей в базу данных), а не id последней записи. Так как в момент получения данных несколько последних записей могут быть удалены.

Есть ли подобная функция в JDBC?

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

Также нашёл метод getGeneratedKeys(), но опять же насколько я понял - он может вернуть значение ID только если прямо перед этим был выполнен INSERT в базу данных, что мне не подходит.

-- P.S. не хватает метки JDBC.

Ответы

▲ 2

В SQL Server есть функция IDENT_CURRENT('TableName'). Рекомендую поискать что-нибудь похожее.

▲ 1

У меня тож такая задача была. И сколько я не изучал разные мануалы, статьи и хэлпы по БД, я не нашел такой функции. Т.е. вроде, можно и брать максимальный ID сразу после вставки, но тут могут возникнуть проблемы, и этот способ не подходит.
Я остановился на таком методе (хоть он и не сильно хорош по производительности):
          В моем случае было так, что если я делаю одну новую вставку в таблицу, то она уже уникальна (т.е. пять столбцов, и хотя бы один обязательно будет уникальным), т.е. если потом сделать выборку по условиям только-что вставленных значений, то это и будет именно та запись, которая была вставлена.

Но вот Вы указали, что язык программирования Java. И вот в Java есть некоторые замечательные (хоть и сложные из-за большой своей функциональности) фрэймворки, которые полностью на себя берут взаимодействие с базой данных. А именно до той степени, что БД остается ТОЛЬКО хранилищем информации, и все. А бизнес-логика самой программы уже берет на себя ответственность за генерацию уникального ID, вставку, выборку и т.д. Вот два одних из самых известных: EJB JPA, и еще Spring. Такой подход находят хорошим многие программисты.
          Мне видится еще один выход:
Как я понял, то, что Вы написали

Интересует именно значение счётчика (оно отображает реальное количество добавленных записей в базу данных), а не id последней записи.

дак это то, что БД ставит уникальный ID в зависимости от количества уже присутствующих в БД записей. Ну, если это так, то :
Так как добавление новой записи в таблицу занимает очень мало времени, то ради хорошей и качественной функциональности программы можно и сделать так:

  1. Когда ставится новая запись в БД, делать запрещение любых транзакций с таблицей (или со связанными таблицами, если это важно), кроме чтения;
  2. Пытаться ставить новую запись:
    1 - вычислить количество записей,
    2-вставить запись с id=количество записей+1;
    3-сохранить этот ID для дальнейших нужд;
  3. При любой ошибке и при любом завершении транзакции, делать дальнейшее разрешение изменений в таблице.

Не могу сказать сейчас откуда я этот способ прочитал, но была книга "умной".

▲ 1

Итак... Подвожу итоги.

Наиболее правильный способ - это создать отдельную таблицу, куда и сохранять значение каждый раз при добавлении новой записи.

Менее правильный способ, но главное действующий. Основной смысл - получаем из служебной таблицы данное значение. Он подходит только для базы данных H2, но я уверен и в других база есть нечто подобное:

//dbTable - название Вашей таблицы в БД //ID - название столбца с auto_increment //sequence_name - идентификатор строки со значением id (auto_increment) //current_value - как раз искомое значение

SELECT sequence_name FROM information_schema.columns WHERE table_schema = 'PUBLIC' AND table_name = 'dbTable' AND column_name = 'ID';

SELECT current_value FROM information_schema.SEQUENCES WHERE sequence_name = 'sequence_name';

Всем спасибо за помощь и отзывы!