Ошибка повторяющегося ключа при использовании INSERT DEFAULT

Я получаю ошибку дублирующегося ключа, Ошибка DB2 SQL: SQLCODE=-803, SQLSTATE=23505, когда я пытаюсь вставить записи. Первичный ключ - это один столбец, INTEGER 4, Generated, и это первый столбец.

вставка выглядит следующим образом: INSERT INTO SCHEMA.TABLE1 значения (DEFAULT,?,?, ...)

Насколько я понимаю, использование значения DEFAULT позволит DB2 автоматически генерировать ключ во время вставки, что я и хочу. Это работает большую часть времени, но иногда / случайно я получаю ошибку дублирующего ключа. Мысли?

В частности, я работаю с DB2 9.7.0.3, использую Scriptella для копирования группы записей из одной базы данных в другую. Иногда я могу обработать связку без проблем, иногда я сразу получаю сообщение об ошибке, иногда после 2 записей, или 20 записей, или 30 записей, и т. Д. Кажется, что это не шаблон и не то же самое. записывать каждый раз. Если я изменю данные, чтобы скопировать 1 запись вместо набора, иногда я получаю ошибку один раз, тогда в следующий раз все будет хорошо.

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

Редактировать: добавить создать информацию:

Create table SCHEMA.TABLE1 (
  SYSTEM_USER_KEY   INTEGER   NOT NULL
    generated by default as identity (start with 1  increment by 1  cache 20), 
  COL2...,
)

alter table SCHEMA.TABLE1
    add constraint SYSTEM_USER_SYSTEM_USER_KEY_IDX
    Primary Key (SYSTEM_USER_KEY);

2 ответа

Решение

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

select s.nextcachefirstvalue-s.cache, s.nextcachefirstvalue-s.increment 
from syscat.COLIDENTATTRIBUTES as a inner join syscat.sequences as s on a.seqid=s.seqid 
where a.tabschema='SCHEMA' 
  and a.TABNAME='TABLE1' 
  and a.COLNAME='SYSTEM_USER_KEY'

Итак, в основном произошло то, что каким-то образом вы получили записи в своей таблице с идентификаторами, которые больше, чем текущее последнее значение вашей последовательности идентификаторов. Поэтому рано или поздно эти идентификаторы столкнутся с идентификаторами, сгенерированными идентичностью.

Есть разные причины того, как это могло произойти. Одна возможность состоит в том, что были загружены данные, которые уже содержали значения для столбца id или что записи были вставлены с фактическим значением для идентификатора. Другой вариант заключается в том, что последовательность идентификаторов была сброшена для запуска с более низким значением, чем максимальный идентификатор в таблице.

Какой бы ни была причина, вы также можете захотеть исправить это:

SELECT MAX(<primary_key_column>) FROM onsite.forms;
ALTER TABLE <table> ALTER COLUMN <primary_key_column> RESTART WITH <number from previous query + 1>;
Другие вопросы по тегам