[前][次][番号順一覧][スレッド一覧]

mysql:8889

From: ML account <ML account <ml@xxxxxxxxxx>>
Date: Tue, 02 Mar 2004 23:40:55 +0900
Subject: [mysql 08889] Re: 整数フィールドの次の空きを探す sql は

 こんにちは。

柴垣 <akiro@xxxxxxxxxx>さんの
<20040302164032.72C8.AKIRO@xxxxxxxxxx>
"[mysql 08888] Re: 整数フィールドの次の空きを探すsql は"


> > そのシーケンシャルのテーブルを t_seq として
> > 
> > select min(t.id) from t_seq left join t using (id)
> > where t.id > 2 and t_seq.id is null group by t.id;
> > 
> > で、いかがでしょう?
> 
>  わたしも、似たような方向では考えてみているのですが、
> (上のSQL文は、下記のようでしょうか? t_seq が跳びの
> ないシーケンシャルなファイルとすると、以下のように
> なると思うのですが、シーケンシャルテーブルの意味が
> 私の了解と違うのかもしれません。)

 かわじさんのやり方は、テーブルt_seqに全ての数をあらかじめ入れておくも
ので、抜けを捜す段階でt_seqを作り直す、というものでは無いと思いますよ。


>  ただし、この方法では、シーケンシャルテーブルをどう
> やって作るかが、問題になります。例えば、整数1から
> 整数2までのシーケンシャルテーブルを作るにはどうすれば
> いいのでしょうか。はじめに auto increment のフィールドに
> 整数1をいれ、その後、(整数2−整数1)個のnull データを
> 追加する、といった方法しか今のところ思いつきません。

 プログラムを使えば良いと思います。 CでもPerlでもJavaでも、それこそ
shellででも。

    create table t_seq (id int not null primary key)

なテーブルにidが0から100のレコードを挿入する事をshell(bash)で行
うとすれば、

    id=0; while [ $id -le 100 ]; \
    do echo "insert into t_seq(id) values($id)" | mysql some-db; \
    let id++;
    done

の様なものになると思います。


> >  何の目的で数字の抜けを捜さなければならないのか
> 
>  とりあえず、先方の要求なのですが、ランダムに使っている数字を
> ムダなく使い切りたい、そのための候補を自動的に提示したい、
> といった用途です。

 お客さんの要求、それは大変ですね。で、その「ムダなく使い切りたい」が本
当に重要なんでしょうか。今となっては手遅れとも思いますが、本当にそうやら
なければならないのかの調査が必要でしょう。

 [mysql 08885]の(2)の方法は、ぼくの周辺では「スロット」と呼ばれるやり方
です。一般に何と呼ばれているのかは知りません。かわじさんのleft joinの方
法よりも (検索と更新で)速度的に有利と考えますが、テーブル設計を失敗する
と一層のストレージの無駄が発生しかねない方法ですね。



    松枝知直    <tomom@xxxxxxxxxx>
            http://www.argus.ne.jp/~tomom/



[前][次][番号順一覧][スレッド一覧]

      8880 2004-03-02 15:16 [柴垣 顕郎 <akiro@xx] 整数フィールドの次の空きを探す sql は   
      8882 2004-03-02 15:59 ┣[KAWAJI Shinya <kawaj]                                       
      8883 2004-03-02 16:04 ┃┗[KAWAJI Shinya <kawaj]                                     
      8888 2004-03-02 20:50 ┃ ┗[柴垣 <akiro@xxxxxxxx]                                   
->    8889 2004-03-02 23:40 ┃  ┗[ML account <ml@xxxxx]                                 
      8890 2004-03-03 08:47 ┃   ┗[KAWAJI Shinya <kawaj]                               
      8894 2004-03-03 09:28 ┃    ┣[柴垣 <akiro@xxxxxxxx]                             
      8899 2004-03-03 12:54 ┃    ┃┗[Seiji Uramoto <uramo]                           
      8895 2004-03-03 10:11 ┃    ┣[ML account <ml@xxxxx]                             
      8898 2004-03-03 12:35 ┃    ┗[班石悦夫 <madara@xxx]                             
      8900 2004-03-03 14:44 ┃     ┗[ML account <ml@xxxxx]                           
      8885 2004-03-02 16:19 ┣[ML account <ml@xxxxx]                                       
      8886 2004-03-02 18:48 ┗[班石悦夫 <madara@xxx]