somemo's diary

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【Oracle】シーケンスとその値をPKに持つが制約に引っかかった時

プログラム側に問題がないのに、PK制約に引っかかったことがあったのでその時のメモです。

シーケンスの確認

前回と同様に、ユーザが持っている情報からシーケンスを探し出します。ただし、特定するのはめんどうなので、全体から探し出します。

select * from all_sequences
where sequence_name like '%xx%'

前回と同様に、ユーザが持っている情報からシーケンスを探し出します。ただし、特定するのはめんどうなので、全体から探し出します。

SEQUENCE_OWNERシーケンスの所持者
SEQUENCE_NAMEシーケンス名
MIN_VALUE最小値
MAX_VALUE最大値
INCREMENT_BY増分値
CYCLE_FLAG最大値後、最小値からやり直すか(Y/N)
ORDER_FLAGシーケンスの大小関係を順序どおりにするか(Y/N:デフォルト)
CACHE_SIZEキャッシュする個数(NOCACHEでキャッシュなしにできる)
LAST_NUMBER現在値

おそらく、現在値と登録されているレコードに不整合が起きていると思います。

解決策

テスト用データを、シーケンスの値を使用せずに作成した場合に今回タイトルに示したことが発生します。以下のようなことをすれば、解決できると思います。最後の方法は、シーケンスに依存しているレコードが存在する場合に、影響する可能性があるのでなんともいえません。

  • dualテーブルでシーケンス.nextvalをひたすら実行
  • orderを変える
  • 開発ならばシーケンスをDROP後にStartの値を最大値+1で再作成