1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Oracle DBのシーケンスを手動で進める

Posted at

何者かが手動で50件データ投入した

↓これに

id name price
1 foo 100
2 bar 150
3 baz 200

↓何者かがこれを投入した。

id name price
4 fuga 990
: : :
53 hoge 999

↓当然こうなった。

id name price
1 foo 100
2 bar 150
3 baz 200
: : :
53 hoge 999

しかし、シーケンスが3で止まっているので、オンラインシステム経由でinsertしようとするとidに4を設定しようとして、4は既に存在するので一意制約違反でシステムエラー。オンラインシステム全部動かなくなりました。なんてことしてくれるんだ。

とにかくシーケンスを進めよう

結果が53になるまでひたすらNEXTVALを連打します。

SELECT XXX_SEQ.NEXTVAL FROM DUAL

これを50回繰り返せばOK。
50件程度なら何も考えずに連打してしまった方が速いです。

じゃあ1000件だったら1000回連打するのか

ALTER SEQUENCEで一時的に増分値を増やす方法が以下で挙げられていますが、今動いている環境でこれをやるのは感心しません。また、増分値を戻し忘れる、誤った値に戻してしまうなどの事故のもとにもなりかねません。

だいたいこの手の作業ミスって、結合テストの後半くらいに原因不明のバグとしてあらわれてくるので困るのです。

とはいえ、流石に1000回もNEXTVALやってられないので別の方法を考えます。CONNECT BY LEVELを使ってみましょう。以下はLEVELという疑似列を作成する構文を組み合わせたものです。
CONNECT BY LEVEL <= 1000 で、1~1000までの連番が生成されます。

SELECT LEVEL, XXX_SEQ.NEXTVAL FROM DUAL CONNECT BY LEVEL <= 1000

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?