何者かが手動で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