• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:日付時刻+連番の主キーをSQLだけで作りたい)

日付時刻+連番の主キーをSQLだけで作りたい

このQ&Aのポイント
  • 日付時刻+連番で主キーを作成する方法についての質問です。一番古いレコードを取得するためには、連番を振ることで対応できますが、日付時刻+連番の場合、同時刻で連番が先頭に戻ると順番が守れません。この問題をSQLだけで解決する方法があるのか教えてください。
  • ORACLEを前提として、日付時刻+連番で主キーを作成したいです。連番のみであれば対応できますが、同時刻で連番が先頭に戻るという問題が発生します。このような場合でもSQLだけで対応する方法があるのか教えてください。
  • SQLを使用して日付時刻+連番の主キーを実現したいです。連番のみであれば問題ありませんが、同時刻で連番が先頭に戻ると順序を守ることができません。SQLだけでこの問題を解決する方法があるのか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

シーケンスを使う方法としては、1分以内に9999を超えることがないなら、 シーケンスを1分毎に0にリセットして使えばいいと思いますし、 他の方法としては、 連番 = (select nvl((select max(連番)+ 1 from テーブル where 連番 like to_char(sysdate,'hhmiss') || 'A%') ,to_char(sysdate,'hhmiss') || 'A0001') from dual) で既に登録されたデータに1を加えてもいいと思いますが。 ※どちらも秒単位で連番という仕様で書いています。  単に連番で付けている番号だけでサイクリックにすると質問の現象は防げません。  (防ぐためには、サイクリックにはできません。どこかでリセットするか十分に大きな桁数をとるか   いづれかが必要です。) なお、同時に複数のコミットされていないデータが発生する (DB側が、2CPU以上で同時に処理されている)というのなら、不可能。 (複数のCPUをまたいで連番を共有することはプログラムでもできっこないです。) ・・・2CPU以上で同時に処理されているのでなければミリ秒まで同一のデータが出来るのは あまり起きないと思うのですが。

xenoarcs
質問者

お礼

回答ありがとうございます。 SQLだけでは難しそうですね。 参考にさせて頂きます。

その他の回答 (1)

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

なぜ主キーで判断しようとするのか? レコード作成日時の列をTIMESTAMP型・デフォルト設定じゃダメなの? TIMESTAMP型ならミリ秒までの精度がありますよ。

xenoarcs
質問者

補足

回答ありがとうございます。 ミリ秒では重複する可能性が高いのでTIMESTAMP型そのままでは使えません。 連番を主キーにして、TIMESTAMP型のカラムも用意すればレコード作成日時はわかりますが、 質問にもあるようにレコード作成日時は使用しません。

関連するQ&A