У меня здесь странная ситуация. Я использовал триггеры и последовательности для реализации автоматического увеличения. Я вставляю данные в свои таблицы из своего веб-приложения, которое использует Hibernate. Я тестирую веб-приложение на своей машине (Netbeans), а также в своей офисной сети (веб-приложение также развертывается на нашем сервере с Wildfly).Oracle автоинкремент с последовательностью и триггером
Он всегда работал нормально, пока я не начал получать исключения из-за уникального ограничения (первичный ключ). Затем я обнаружил, что проблема заключается в последовательности, которая генерирует значения для идентификаторов. Например, для моей таблицы xtable, LAST_NUMBER его последовательность является 78400, максимальный идентификатор в xtable является 78308, но NEXTVAL Последовательность является 78304. Я понятия не имею, как это происходит потому, что я создал последовательность со следующим:
CREATE SEQUENCE XTABLE_SEQUENCE INCREMENT BY 1 START WITH 1;
Я попытался следующие обновить последовательность и сделать его NEXTVAL больше максимального (ID) в таблице, но я все еще получаю тот же результат после того, как п вставляет
declare
maxval number(10);
begin
select max(ID) into maxval from XTABLE;
maxval := maxval+1;
execute immediate 'DROP SEQUENCE XTABLE_SEQUENCE';
execute immediate 'CREATE SEQUENCE XTABLE_SEQUENCE START WITH '|| maxval+50 ||' INCREMENT BY 1';
end;
Вот триггер заявление:
create or replace TRIGGER xtable_sequence_tr
BEFORE INSERT ON xtable FOR EACH ROW
WHEN (NEW.id IS NULL)
BEGIN
SELECT xtable_sequence.NEXTVAL INTO :NEW.id FROM DUAL;
END;
Или что такое правильный способ реализовать автоинкремент в Oracle, чтобы избежать проблемы, с которой я столкнулся? В какой-то момент я запускаю уникальное нарушение ограничения ключа на первичном ключе из-за того, что (я не знаю, по какой причине) максимальный id в таблице оказывается больше, чем последовательность .nextval, используемый в триггере. Что вызывает это и как его исправить?
Что произойдет, если вы воссоздаете последовательность, но с 'nocache', а не' cache 100'? Кроме того, ваша база данных является базой данных RAC? – Boneist
Вы упомянули триггеры. Покажите нам их содержание, пожалуйста. А также операторы sql, сгенерированные спящим, а также –
Вы написали 'last_number своей последовательности: 78400, максимальный id в xtable равен 78308, но следующий следующий код равен 78304.' Но последовательность Oracle не может отменить значение nextval. Вы изменили его вручную? – AlexSmet