Я столкнулся с некоторыми проблемами с автоматически увеличивающимися столбцами IBM DB2. Сначала все мои столбцы были определены как СОЗДАЕТСЯ ВСЕГДА, но поскольку у меня были проблемы с этим при использовании команды "db2 import ...", я изменил их на ПО УМОЛЧАНИЮ. Это необходимо, поскольку мне нужно, чтобы идентификаторы были согласованными, потому что на них ссылаются другие таблицы. Таким образом, использование «db2 import ... modified by identityignore ...» не вариант.
Когда я сейчас импортирую данные, идентификаторы вставляются правильно, но каждый раз, когда я это делаю, я должен не забывать установить новое начало для столбца с автоинкрементом, получив наивысший Id + 1, и изменить столбец следующим образом:
SELECT MAX(mycolumn)+ 1 FROM mytable;
ALTER TABLE mytable ALTER COLUMN mycolumn RESTART WITH <above_result>;
Если я забуду это, Insert-Statement завершится ошибкой с повторяющейся ошибкой PK, поскольку столбец автоинкремента является первичным ключом.
Итак, мой вопрос: есть ли способ найти следующее значение для столбца с автоинкрементом, чтобы я мог написать утверждения, которые проверяли бы, меньше ли это значение, чем SELECT MAX, и его необходимо установить?
Или: Разве все это не так сложно, как мне кажется? Могу ли я каким-то образом импортировать данные, сохранив идентификаторы, и чтобы столбец с автоматическим приращением работал должным образом?
Тим, я столкнулся с той же проблемой, когда мне нужно было перезапустить идентификацию до следующего значения. Я использовал db2v9.1.
К сожалению, нет возможности автоматически указать следующее значение. Согласно документации DB2, значение должно быть «числовой константой». Следовательно, мне пришлось выбрать max (id), получить значение и заменить его в alter..restart stmt вручную.
Я не помню, пробовал ли я это, но вы можете написать sp, где max (id) установлен в переменной, и назначить переменную в alter ... restart stmt. (Я не могу попробовать, поскольку у меня больше нет доступа к какой-либо базе данных db2). Я сомневаюсь, что это сработает. (Если сработает, дайте мне знать :))
Ссылка на DB2:
ПЕРЕЗАПУСК или ПЕРЕЗАПУСК С числовой константой
Сбрасывает состояние последовательности, связанной со столбцом идентификаторов. Если числовая-константа WITH не указана, последовательность для столбца идентификаторов перезапускается с того значения, которое было задано явно или неявно в качестве начального значения при первоначальном создании столбца идентификаторов. Столбец должен существовать в указанной таблице (SQLSTATE 42703) и уже должен быть определен с атрибутом IDENTITY (SQLSTATE 42837). RESTART не изменяет исходное значение START WITH.
Числовая константа - это точная числовая константа, которая может быть любым положительным или отрицательным значением, которое может быть присвоено этому столбцу (SQLSTATE 42815), без наличия ненулевых цифр справа от десятичной точки (SQLSTATE 428FA). Числовая константа будет использоваться в качестве следующего значения для столбца.
Разве вы не можете использовать порядковый номер в DB2, а затем использовать последовательность. nextval ()?
Ссылка на автоматическое создание значений последовательности в DB2: http://www.ibm.com/developerworks/data/library/techarticle/0302fielding/0302fielding.html
Возможно, ваша проблема уже решена, но для всех остальных с той же проблемой: я могу предложить решение для получения 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'