ここでは奇妙な状況があります。トリガとシーケンスを使って自動インクリメントを実装しました。私は、Hibernateを使用する私のWebアプリケーションから私のテーブルにデータを挿入します。私は私のマシン(Netbeans)と私のオフィスネットワーク(WebアプリもWildflyで私たちのサーバーに配備されている)でWebアプリケーションをテストします。シーケンスおよびトリガーの問題を伴うOracle自動インクリメント
一意の制約(プライマリキー)のために例外が発生するまで、常にうまくいきました。次に、問題はIDの値を生成するシーケンスであることがわかりました。例は、私のテーブルxtableの場合、その配列のLAST_NUMBERは78400で、xtableで最大のIDは78308ですが、シーケンスのNEXTVALは、私は次のようにシーケンスを作成したので、それが起こるかは考えていません78304.です:
CREATE SEQUENCE XTABLE_SEQUENCE INCREMENT BY 1 START WITH 1;
を
私はシーケンスを更新し、テーブルに最大(ID)よりもそのNEXTVALが大きくなるようにするには、次のを試してみましたが、nはここ
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がトリガーで使用されたsequence.nextvalよりも大きくなるという事実が原因で(私にはなんの理由がわからないので)プライマリキーのユニークなキー制約違反を取得し始めます。それを引き起こしているものとそれを修正する方法は?
'cache 100'ではなく' nocache'を使ってシーケンスを再作成するとどうなりますか?また、データベースはRACデータベースですか? – Boneist
トリガーについて言及しました。私たちに彼らのコンテンツを見せてください。また、hibernateによって生成されたSQL文 –
'シーケンスのlast_numberは78400、xtableの最大IDは78308ですが、シーケンスのnextvalは78304です。'しかし、Oracleシーケンスはnextval値をロールバックできません。手動で変更しましたか? – AlexSmet