Oracleのシーケンスの取得値を所定値に変更する
OracleのDBで、シーケンス値を使用するカラムを持つテーブルのデータを移行するときに起きる問題。
Oracleでは、シーケンスとテーブルは別に扱う。このため、テーブルのデータを移行するときには あわせてシーケンスの値も変更しないと、値が重複してしまうことになる。
主キーの値としてシーケンスを使用することは多く、その値が制約違反により登録できない、といった現象が起きる。
この現象を避けるためには、シーケンスの取得値が移行データとかぶらないようにする必要があるのだが、シーケンスの値を簡単に変更するようなSQL文は存在しない。
そこでいくつかのSQL文を実行して、最終的に取得値を所定値にすることになる。
以下は例として、foo_seq
というシーケンスの取得値を11
にするための手順。
1. シーケンスを削除する
シーケンスが存在するときは、一旦削除する。
DROP SEQUENCE foo_seq;
2. シーケンスを作成する
シーケンスを作成する。初期値、最小値、増分値を全て1にする。
CREATE SEQUENCE foo_seq START WITH 1 MINVALUE 1 INCREMENT BY 1;
3. 増分値を変更する
ALTER文で増分値を10
に変更する。この値は、開始したい値(11
)から1を引いたもの。
ALTER SEQUENCE foo_seq INCREMENT BY 10;
4. シーケンス値を取得する
SELECT文で、このシーケンスの値の現在を取得する。
SELECT foo_seq.nextval FROM dual; NEXTVAL ---------- 10
これによって、シーケンスの値が10になる。
5. 増分を1にする
増分を1に戻す。
ALTER SEQUENCE foo_seq INCREMENT BY 1;
これで、次回のシーケンスの取得では11
になる。
SQL> SELECT foo_seq.nextval FROM dual; NEXTVAL ---------- 11