4

開発環境にリリースする挿入がいくつかありますが、開発者は挿入を行うときに正しい識別子を取得するためにシーケンスを使用していません。彼が行ったことは本番データベースに入れられ、最大の識別子が何であるかを見つけ、それに数百の数字を追加しました。起動するために、彼は今会社を辞めました。

したがって、prodへのスクリプトはこれらの何百もので満たされています:

INSERT INTO table (sequencecol, cola, colb) VALUES (90001,'test','test');

INSERT INTO childtableB (foreignkeyTableA, cola) VALUES (90001,'test')

あるべきだったとき

INSERT INTO tableA (sequencecol, cola, colb) VALUES (tablesequence.NEXTVAL,'test','test');
INSERT INTO childtableB (foreignkeyTableA, cola) VALUES (tablesequence.CURRVAL,'test')

私が扱っているシナリオはこれよりも複雑で、書き直す時間がありません。代わりに、このスクリプトの一部として挿入されたレコードの最大値にシーケンスを設定したいだけです。

シーケンスの値を変更して、挿入するレコードの最大値+1の値に設定することはできますか?

私はより良い提案を受け入れています

4

1 に答える 1

11

アプローチは良いです。

しかし、この関連する質問への回答を見ると、シーケンスを特定の値にリセットするのは簡単ではありません。

ここに戻る必要はないので、ループ内で必要な場所になるまでシーケンスの数値を消費する小さなスクリプトを作成するだけかもしれません。

または、それがたくさんの数であるならば、これ

-- First, alter the object so the next increment will jump 1000 instead of just 1.
alter sequence myschema.seq_mysequence increment by 1000;

-- Run a select to actually increment it by 1000
select myschema.seq_mysequence.nextval from dual;

-- Alter the object back to incrementing only 1 at a time
alter sequence myschema.seq_mysequence increment by 1;
于 2012-06-08T04:49:54.923 に答える