• ベストアンサー
※ 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

  • エクセルセル内を読み取り連番を振りたいです。

    エクセルセル内を読み取り連番を振りたいです。日付、データ、連番用の3つのカラムがあります。 データにAという文字が含まれる場合は連番用のセルに0001から始まる連番を自動出力させたいと思います。Aが入っていないセルは出力は不要なので飛ばします。 データは続けてうちますが、月が変わったときには0001に戻したいのですが、よろしくお願い致します。

  • ORACLE のSQL について

    おはようございます。 ORACLEのSQLについて教えてください。 GROUP BY で抽出されたデータの レコード数を把握するSQLはどのようにすればよいのでようか。 ********************** 例: SQL: SELECT TEST_CD FROM TABLE GROUP BY TEST_CD 結果: 01 02 03 04 05 ********************** この結果のレコード(5レコード)のSQL式はどのようになりますか?

  • Oracle(オラクル)で、日付時刻型の検索方法について

    質問させていただきます。 データベースはオラクルを使っていて、 SQL文で、抽出するときにエラーが出て困っています。 日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。 2005/05/26 を抽出したいのですが、 BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59' だと、エラーでできません。 どなた様か、ご教授よろしくお願いしますm(_ _)m

  • SQLについて教えてください

    お世話になっております。 以下、取得したい内容です。 この内容に対して、どのようにSQLを書けばよいか良いか教えて頂きたいです。 (1)DBの全テーブルに対して特定のカラムを取得したい。(カラム名はA,Bとする) (2)取得したカラム.Aに格納されている各値に対して、カラム.Bの各レコードの項目には何の値が格納されているか知りたい。 DBはオラクルですが、オラクルでしか使えないSQL構文はつかないようにしたいです。 自分で考えたSQLは、 SELECT A,B FROM * GROUP BY A,B ですが、そもそも全テーブルを指定する際に使用するのが、「*」では正しくないような気もします。 説明がつたなくて申し訳ございません。 宜しくお願い致します。 ・テーブルイメージ テーブル.test1 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 1 | | 02 |AA| 1 | | 03 |AB| 2 | | 04 |AB| 2 | | 05 |AC| 3 | | 06 |AC| 3 | | 07 |AC| 3 | +--------+------+ テーブル.test2 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 1 | | 02 |AA| 1 | | 03 |AB| 2 | | 04 |AB| 2 | | 05 |AC| 1 | | 06 |AC| 3 | | 07 |AC| 3 | +--------+------+ テーブル.test3 +--------+------+ | No | A | B | +--------+------+ | 01 |AA| 3 | | 02 |AA| 1 | | 03 |AC| 2 | | 04 |AC| 3 | +--------+------+

  • ACCESS+SQL Serverで主キーを自動採番する

    ACCESS+SQL Serverで主キーを自動採番する ACCESSを独学で勉強を開始しているものです。 顧客管理のようなものを作りたいと思っているのですが、 オートナンバーではない主キー(顧客コード)を設定しているテーブルがあります。 顧客コードの構成はアルファベット1文字+数字8桁です。 そのうち、数字は西暦2桁+月2桁+日2桁+下2桁は連番です。 ACCESS2007プロジェクトで、SQL Server 2005 Express Editionへ接続しテーブルは作ってあり、既に顧客データが10件ほど入っています。 新規に顧客データを追加する際に、必要事項を入力し、登録ボタンを押した段階で顧客コードを自動生成し、重複チェックし、採番したいと考えています。 アルファベットは必要事項入力時に入力済み、日付もその日の日付を6桁設定し、とりあえず「01」と下2桁を採番して、現在のデータに同じものがないかチェックします。 そして、同じものがあれば「01」+1を繰り返しながらチェックしていくというようなコードはどのようにすればいいでしょうか? わかりづらいとは思いますが、よろしくお願いします。

  • SQLで質問です。

    SQLで以下のようなレコードを引くことは出来るでしょうか。 オラクル9です。 フィールド1  フィールド2  フィールド3  フィールド4  5... (1~4でキー) A  あ  1  2011/01/01  ... A  い  1  2011/01/01  ... 以上のように、複数のキーの中でひとつだけ違うレコードを出すSQLはどう組めばよいでしょうか。 「あ」と「い」両方出したいのと、「う」があっても「あ」と「い」に限定できれば最高です。 よろしくお願い致します。

  • SQL について教えて下さい

    ---------------------------------------- テーブルAの カラム1、カラム2のデータが 10、作業A 20、作業B 30、作業C ---------------------------------------- テーブルBの カラム1、カラム2のデータが 10、2013/1/1 10、2013/2/1 20、1999/1/1 20、1999/2/1 ---------------------------------------- のようなデータがあります テーブルA、テーブルBのカラム1はリレーションです この2のテーブルから、テーブルBの最新日付の カラム1のグループ毎に選択するSQLを教えて下さい ---------------------------------------- 結果 10、作業A、2013/2/1 20、作業B、1999/2/1 ---------------------------------------- select テーブルA.カラム1,テーブルA.カラム2,テーブルB.カラム2 で、条件をどうしたら、テーブルBの最新日付を取り出せますか

  • 複数の行を集約するSQLについて

    以下のテーブルのレコードをもとに A B C 1| あ | あ | 1 | 2| あ | い | 1 | 3| あ | う | 1 | 4| う | あ | 1 | 5| え | あ | 1 | 6| あ | あ | 2 | 7| あ | い | 2 | 8| あ | う | 2 | 9| う | あ | 2 | 以下のテーブルを作成したいと考えています。 A B C D E 1| あ | あ | 1 | あ | - | 2| あ | い | 1 | い | - | 3| あ | う | 1 | う | あ | 4| え | あ | 1 | - | え | 5| あ | あ | 2 | あ | - | 6| あ | い | 2 | い | - | 7| あ | う | 2 | う | あ | (1)カラムCを1つのグループとします。 (2)その中でカラムAの値が「あ」の場合は、カラムBの値をカラムDに設定する。 (3)カラムAの値が「あ」ではない場合は、カラムBの値をカラムEに設定する。 (4)カラムAの値とカラムBの値を入替えると同じ場合は(例では上の表の3と4、8と9のレコード)、 カラムAの値が「あ」でない方のレコード(4と9のレコード)のカラムBの値をカラムEに設定する。 (5)(4)で値を設定した方のレコードを削除する。 どのようなSQLを作成すればできるのでしょうか? SQLに詳しい方がいらっしゃれば、ご教授をお願います

  • SQLの日付+その他の取得

    SQLで和暦と日付の変換後の表示を行いたいです。 フィールド名Aに6桁の数字(199811など)が入っていて これを(和暦)yy年mm月と表示させたいのですが、 SQLで変換可能なのでしょうか? フィールド名A,テーブル名B,(必要であれば)フィールド名Aの別名Cとして、 SELECTの構文を教えていただきたいです。

  • プライマリキーのみを変更して、複数行insertする方法

    こんにちは。 oracle(9i)のテーブルにinsertを行おうと思っているのですが、 困っているので質問させていただきます。 Aテーブルに5カラムあるとします。 カラム1はプライマリキーです。 例えば、1レコードが下記のようになっているとします。 カラム1 カラム2 カラム3 カラム4 カラム5 ---------------------------------------------- 001 あああ いいい ううう えええ プライマリキーに1を足して、他のカラム2から5までは同様の内容で insetをしたいと思っています。 つまり、下記のようなレコードになります。 002 あああ いいい ううう えええ 003 あああ いいい ううう えええ このようにプライマリキーのみを変更して200レコードくらいを insertしたいと思いますが、どのようにすればよいでしょうか。 できれば、PL/SQLかSQLのスクリプトで実行したいと思います。 ご存知の方、ご教授願います。 よろしくお願いいたします。