Ошибка повторяющегося ключа при использовании 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>;