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]