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

mysql:8895

From: ML account <ML account <ml@xxxxxxxxxx>>
Date: Wed, 03 Mar 2004 10:11:54 +0900
Subject: [mysql 08895] Re: 整数フィールドの次の空きを探す sql は

 こんにちは。

KAWAJI Shinya <kawaji@xxxxxxxxxx>さんの
<20040303084756'ngFEY@xxxxxxxxxx>
"[mysql 08890] Re: 整数フィールドの次の空きを探すsql は"


> > >  わたしも、似たような方向では考えてみているのですが、
> > > (上のSQL文は、下記のようでしょうか? t_seq が跳びの
> > > ないシーケンシャルなファイルとすると、以下のように
> > > なると思うのですが、シーケンシャルテーブルの意味が
> > > 私の了解と違うのかもしれません。)
> > 
> >  かわじさんのやり方は、テーブルt_seqに全ての数をあらかじめ入れておくも
> > ので、抜けを捜す段階でt_seqを作り直す、というものでは無いと思いますよ。
> 
> いや、これは単に私の書いた SQL が間違っていただけの話だと思います。
> すみません。

 あれ、そうですか?連番のテーブルはマスタ扱いがよさげ、毎回作り直すのは
無しかなあ、と思っていたのですが。


>  1. 今の時点で、テーブル内にあるデータはすべてフラグをオンにする
>  2. 抜けのある数をすべてスクリプトなどで調べ上げて、その数について、
>     フラグをすべてオフにした状態で適当なデータを挿入する
>  3. 通常の検索や集計などはフラグがオンのもののみ対象とする
>  4. データの削除はフラグをオフにするのみ(削除はしない)
>  5. データの挿入は、まずフラグがオフの行を調べて、見つかればそれを
>     更新することにする。無ければ挿入する。
> 
> 3. のために多くの SQL文を変更しなければならないことと、5. をアトミックに
> やらなければならないことが課題です。

 ですね。2.は、全部の数について「未使用」の状態でレコードを作る、ですか。
SQL文を大幅に変更しなければならない、は、確かに。変更自体はWHERE句をいじ
るだけですが、SQL文があちこちにベタに書いてあったりすると大変ですよね。
 5.をアトミックに行わなければならない、その通りです。連番テーブルから
left joinして抜けを捜す場合も、やはり同様に検索から更新までをアトミック
に行う必要があると思います。どちらも一意違反のリカバリを入れるの軟弱な方
法で、多分大丈夫だとは思いますが。


> しかし、一番いいのは「番号を使い切ることに意味は無い」と言い張ることで
> しょうね。

 御意。auto_incrementな番号ならば、単に挿入するだけですからね。一貫性が
どうのを考える必要は更々無い訳です。
 こういう感じの事、やり方を工夫すればトランザクション等で一貫性の維持の
必要が無いのに、そういうやり方をしないで、「Oracle等のトランザクションを
サポートしている DBMSが必要です」な結論に行き着いてしまう人が多かったり
します。
 それはそれとして、データの持ち方、データ操作のやり方は最上流とは言わな
いまでも、かなり基本的な事項ですね。下流の実装で疑義が発生するので上流の
定義を変えましょう、は、まあ、ママある事ですけれど、それを盛大にやると大
混乱になりますよね。ボクが「手遅れかもしれませんが」と言ったのは、そうい
う話でした。




    松枝知直    <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]