Tim, я столкнулся с той же проблемой, где я должен был перезапустить идентификационные данные к следующему значению. Я использовал db2v9.1.
К сожалению, нет никакого способа указать следующее значение автоматически. Согласно документации DB2 значение должно быть 'числовой константой'. Следовательно я должен был сделать выбор, макс. (идентификатор), получить значение и заменить его в изменении.. перезапустите stmt вручную.
Я не помню, попробовал ли я это - но можно записать SP, где макс. (идентификатор) установлен в переменной, и присвойтесь, переменная в изменении... перезапускают stmt. (Я не могу попробовать, поскольку у меня нет доступа ни к какой db2 базе данных больше). Я сомневаюсь, что это будет работать все же. (Если это работает, действительно сообщают мне :))
Ссылка DB2:
ПЕРЕЗАПУСК или ПЕРЕЗАПУСК С числовым постоянным
Сбрасывает состояние последовательности, связанной со столбцом идентификационных данных. Если С числовым постоянным не указан, последовательность для столбца идентификационных данных перезапущена в значении, которое было указано, или неявно или явно, как начальное значение, когда столбец идентификационных данных был первоначально создан. Столбец должен существовать в указанной таблице (SQLSTATE 42703) и должен уже быть определен с атрибутом ИДЕНТИФИКАЦИОННЫХ ДАННЫХ (SQLSTATE 42837). ПЕРЕЗАПУСК не изменяет исходный ЗАПУСК СО значением.
Числовой постоянной является точная числовая константа, которая может быть любой положительной или отрицательной величиной, которая могла быть присвоена этому столбцу (SQLSTATE 42815) без ненулевых цифр, существующих направо от десятичной точки (SQLSTATE 428FA). Числовое постоянное будет использоваться в качестве следующего значения для столбца.
Ваша проблема, возможно, уже решена, но для всех остальных с такой же проблемой: я могу предложить решение для получения max_id +1 для всех таблиц. Единственное ограничение - исходный столбец должен быть столбцом с автоинкрементом (GENERATED = 'D'). Набор результатов может быть выполнен с помощью clp или других инструментов запросов.
SELECT 'alter table ' || rtrim(TABSCHEMA) || '.' || TABNAME || ' alter column ' || COLNAME || ' restart with ' ||
cast((case when (trim ((replace ( HIGH2KEY, '+' , '' )))) = '' then 0 else integer(trim ((replace ( HIGH2KEY, '+' , '' ))))+2 end) as varchar(20))
|| ' ;'
FROM SYSCAT.COLUMNS
WHERE GENERATED = 'D'
Разве вы не можете использовать порядковый номер в DB2, тогда используйте последовательность. nextval ()?
Ссылка на автоматическое создание значений последовательности в DB2: http://www.ibm.com/developerworks/data/library/techarticle/0302fielding/0302fielding.html