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

mysql:9265

From: ML account <ML account <ml@xxxxxxxxxx>>
Date: Thu, 22 Apr 2004 11:44:48 +0900
Subject: [mysql 09265] Re: auto_increment で次番号を確認したい。

 こんにちは。

高橋政利 <takahashi@xxxxxxxxxx>さんの
<20040422091123.AB4C.TAKAHASHI@xxxxxxxxxx>
"[mysql 09258] Re: auto_increment で次番号を確認したい。"


> 私がベーターベースの基本的な概念が理解できていないのでしょうか、理解でき
> ませんでした。auto_increnentは、自動的に一番大きな番号の次番号を取得して
> くれるありがたい機能だと思っています。

 ありがたいかどうかは以降の文言を見て判断して頂くとして、
auto_increment自体の機能の認識はこれで良いと思います。


> 今回の例で、見積の番号もやはり重複してはならないという点と新しい見積が作
> 成されるたびに番号1番ずつ増えるという点で、この機能を使わない手は無いと
> 思い、そのように設計しました。検索時にも見積番号で追っかけますので、KEY
> にしても良いかと思っております。問題点があるのでしょうか?
> 見積番号の他に管理用の番号を設けた方が良いのでしょうか?

 auto_incrementの使用目的については、単純な連番生成に使うならまだしも、
今回のケースの様な場合にはかなりの注意が必要となるでしょう。

 今回のケースでは、auto_incrementで生成される番号は単なる番号ではなく、
年度+連番の複合的な値、つまり複数の情報をパックして1つのフィールドに納
めている訳です。パックしてある値は、当然ながらアンパック、パックを繰り返
さねばならず、DBMSやDBMSを利用するアプリケーション、そして設計者や実装者
に対しての無用な負荷となる場合が多いもので、特別の理由が無い限り一般的に
は忌避される事です。パックが必要な場合は行われるのは当然ですが、テーブル
定義でそれが必要な場合はそれほど多くは無く、パックが行われる多くの場合は
テーブル設計者があまりDBMSに慣れていない事が理由の場合が多いものです。

 MySQL3.23.58について言えば、auto_incrementで挿入される値は、そのフィー
ルドに最後に挿入された値+1です。未だ挿入されていなければ1、“alter
tabble auto_increment=”で設定が行われていればその数の次の値が挿入されま
す。例えば、伝票の番号が年度+連番のパックが行われているとして、平成16年
度に平成15年度の伝票を追加するメンテを行った場合、次に入力する伝票の番号
は、そのままでは平成16年度の伝票が平成15年度のものになってしまいます。

 この様なケースの場合、ボクならばauto_incrementを使わずに採番テーブルの
使用か、auto_incrementを使っても年度毎にテーブルを分けるか、を考慮するで
しょうね。採番テーブルはOracle等のシーケンスの代替です。

 結局、auto_incrementに限らないのですが、マニュアル等である機能がどうい
う動きをするかを確認するだけで、ある機能が目的に合致すると言う/ある機能
を採用する、は早計なのです。ある機能が他にどういう影響を与えるか、他の機
能がその機能にどういう影響を与えるのかを全部確認する必要があります。それ
をやらないと、後で「ちゅどーん!」てな事になって、全員で海行かばを合唱す
る羽目になるのです。


> 連番に保護措置とは、どういったものなのでしょうか?
> 上で言われている、禁じ手や危険性が理解できないでおります。
> 一般論と言われておりますが、私のレベルでは、まだ「分かっているつもり」で
> 実際にその落とし穴に落ちてみないと、分からないのかもしれませんね。

 「連番に保護措置」ではなくて、
    ・テーブルをロックするとか
    ・トランザクションを使うとか
    ・連番に関しては Oracle等のシーケンスや MySQLでも可能なそれ類似
     の仕組みを使うとか
の保護措置、です。

 どういう風にドツボにはまるかは簡単な推理で可能です。複数人、例えば10人
が同時 (同時期)に伝票を入力するシステムを考えてください。最後に挿入され
た伝票の番号+1をこれから入力しDBに挿入する伝票の番号とする、などと言う
単純な仕組みでは、10人が同じ伝票番号を持ってしまいますね。内容が違う伝票
番号が同じ伝票が10枚、これをどの様に管理しますか?


> テーブルロックついては、機能の概要は知ってるつもりです。「テーブルをロッ
> クすると、他のユーザーは使用できなくなる。」という認識です。メンテナンス
> 時に使うのかな?程度ですが・・・。

 その通り。誰かが他の人にテーブルを使わせない様にするのがテーブルロック
です。「ボクが伝票を入力しているんだから、あんた達は邪魔しないですっこん
でてね(はーと)」ですね。



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



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

      9239 2004-04-20 18:45 [高橋政利 <takahashi@] auto_incrementで次番号を確認したい。    
      9240 2004-04-20 23:29 ┣[Shinya Kawaji <kawaj]                                       
      9245 2004-04-21 09:00 ┃┗[高橋政利 <takahashi@]                                     
      9248 2004-04-21 10:12 ┃ ┗[Shinya Kawaji <kawaj]                                   
      9250 2004-04-21 11:20 ┃  ┗[ML account <ml@xxxxx]                                 
      9246 2004-04-21 09:15 ┣["片寄白王" <katayose]                                       
      9251 2004-04-21 17:39 ┃┗[川合孝典 <gcd00051@x]                                     
      9252 2004-04-21 18:02 ┃ ┣["山本 瑞己" <mizuki]                                   
      9253 2004-04-21 18:53 ┃ ┗[ML account <ml@xxxxx]                                   
      9254 2004-04-22 00:19 ┃  ┗["KATAYOSE hakuo" <ka]                                 
      9255 2004-04-22 01:42 ┃   ┗[ML account <ml@xxxxx]                               
      9256 2004-04-22 09:02 ┃    ┗["片寄白王" <katayose]                             
      9258 2004-04-22 09:36 ┃     ┗[高橋政利 <takahashi@]                           
->    9265 2004-04-22 11:44 ┃      ┗[ML account <ml@xxxxx]                         
      9249 2004-04-21 10:56 ┣[Seiji Tateyama <tate]                                       
      9257 2004-04-22 09:07 ┣[高橋政利 <takahashi@]                                       
      9264 2004-04-22 11:44 ┃┗[ML account <ml@xxxxx]                                     
      9277 2004-04-23 00:29 ┗[Kenji Irie <kenji@xx]                                       
      9279 2004-04-23 08:01  ┗[高橋政利 <takahashi@]