2013-02-14 1 views
1

Я использую SELECT GEN_ID(TABLE,1) FROM MON$DATABASE от PreparedStatement, чтобы сгенерировать идентификатор, который будет использоваться в нескольких таблицах.Создайте несколько идентификаторов сразу в пакетах Firebird для подготовленных выписок

Я собираюсь сделать большое количество INSERT с пакетами PreparedStatement и я ищу способ получить много новых идентификаторов сразу из Firebird.

Выполнение триггера, по-видимому, не может быть и речи, так как я должен INSERT на других таблицах в другое время с этим идентификатором в коде Java. Кроме того, getGeneratedKeys() для партий, кажется, еще не реализованы в (my?) Firebird JDBCdriver.

ответ

1

Как jrodenhi говорит, Вы можете зарезервировать диапазон значений с помощью

SELECT GEN_ID(<generator>, <count>) FROM RDB$DATABASE 

Это будет возвращать значение <count> выше, чем ранее сгенерированный ключ, так что вы можете использовать все значения из (value - count, value] (где ( означает исключительное , ] включительно). Скажем, генератор в настоящее время имеет значение 10, вызов GEN_ID(generator, 10) вернет 20, вы можете использовать 11 ... 20 для идентификаторов.

Это предполагает, что вы обычно используете генераторы для генерируемых идентификаторов для вашей таблицы и что ни одно приложение не создает свои собственные идентификаторы без использования генератора.

Как вы заметили, getGeneratedKeys() не был реализован для партий в Jaybird 2.2.x. Поддержка этой опции будет доступна в Jaybird 3.0.0, см. JDBC-452.

Если вы не предназначаетесь для других баз данных, нет реального преимущества в производительности для использования пакетных обновлений (в Jaybird). Firebird не поддерживает пакеты обновлений, поэтому внутренняя реализация в Jaybird делает то же самое, что и подготовка инструкции и ее выполнение самостоятельно. Это может измениться в будущем, поскольку есть планы добавить это Firebird 4.

Раскрытие информации: Я один из разработчиков JayBird

4

Я отвечаю из памяти здесь, но я помню, что мне когда-то приходилось загружать кучу транзакций из файла Quicken в мою базу данных Firebird. Я загрузил массив транзакциями и установил переменную с именем say iCount на номер. Затем я сделал SELECT GEN_ID (g_TABLE, iCount) из RDB $ DATABASE. Это дало мне следующий идентификатор и увеличило генератор на количество записей, которые я собирался вставить. Затем я начал транзакцию, шагнул через массив и вставил записи один за другим и закрыл транзакцию. Я был удивлен, как быстро это пошло. Я думаю, в то время я работал с 28 000 транзакций, и время было как пара секунд. Что-то вроде этого может сработать для вас.

+0

Идентификатор возвращенное значение генератора после увеличения на 'iCount' –