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

mysql:9289

From: ML account <ML account <ml@xxxxxxxxxx>>
Date: Sat, 24 Apr 2004 15:33:22 +0900
Subject: [mysql 09289] Re: 整数IDのデータ常に連番に

 こんにちは。

hiroyuki.A <tiro1@xxxxxxxxxx>さんの
<4BC429B280E6CCtiro1@xxxxxxxxxx>
"[mysql 09288] Re: 整数IDのデータ常に連番に"


> 実際、追加と削除は管理者だけが行うのでなく、関係する人がみな行います。
> そこで いまはExcelで行っているのでなるべく変化がないほうよいかと
> また、50行ぐらいしかないデータなのですが長期的に考えた場合、50行も無い
> のに整数IDが千単位や万単位になると面倒かなとも思っていたのですが
> みなさんのおっしゃる通り無理に連番にする必要はないですでね。
> タイムスタンプなど別のデータを増やせば主キーが順位をあえて示さなくとも
> よいですね。

 データ(レコード)をWeb画面から削除する場合、そのデータを一意に、そして
簡単に識別する情報が必要ですね。その意味で「1から50までの連番」と言うの
は理解出来ます。ただ、DBMSでそれをやろうとするとかなり面倒臭いと言うか、
他に代替の方法は無いのかを真剣に検討しなければならないでしょう。

 連番を主キーにしてその値を挿入の度にどんどん増やして行くのは良いとして
も、その主キーが Web画面でのデータの識別子として生で出て来るやり方は、
「 Web画面から削除する場合、そのデータを一意に、そして簡単に識別する情報」
としては難があるでしょう。ひろゆきさんの仰る通り、高々50程度しかないデー
タなのに、5桁も6桁もある番号を指定しなければならない設計や実装は、

  「おぉぉ前なぁぁぁぁぁ!何を考えてモノ、作っとるんじゃぁぁぁぁ!」

とドヤされても仕方がないものでしょうね。


 さて、こういう場合によく採られる方法は、Web画面上のデータ番号は単なる
表示上のものとして、削除ボタンや削除リンクに対象テーブルの一意識別子を埋
め込むものです。例としては、まずこんなテーブルがあるとします。

        create table INVENTORY (
            SERIAL int not null auto_increment primary key,
            GOODS varchar(50)
        );

        SERIAL | GOODS       
        -------+-------------
          2220 | ドミンゴ    
          2331 | レオーネ    
          3000 | インプレッサ
          3001 | サンバー    
          3002 | レガシー    

 そこから、この様なHTMLのテーブルを生成します。

<table border="1">
  <tr><td>番号</td><td>商品</td><td>&nbsp;</tr>
  
  <tr>
    <td>1</td>
    <td>ドミンゴ</td>
    <td><a href="/cgi-bin/del.cgi?SERIAL=2220">この行を削除 </a></td>
  </tr>
  
  <tr>
    <td>2</td>
    <td>レオーネ</td>
    <td><a href="/cgi-bin/del.cgi?SERIAL=2331">この行を削除</a></td>
  </tr>
  
  <tr>
    <td>3</td>
    <td>インプレッサ</td>
    <td><a href="/cgi-bin/del.cgi?SERIAL=3000">この行を削除</a></td>
  </tr>
  
  <tr>
    <td>4</td>
    <td>サンバー</td>
    <td><a href="/cgi-bin/del.cgi?SERIAL=3001">この行を削除</a></td>
  </tr>
  
  <tr>
    <td>5</td>
    <td>レガシー</td>
    <td><a href="/cgi-bin/del.cgi?SERIAL=3002">この行を削除</a></td>
  </tr>
</table>

 各行の先頭セルの値は1から始まる連番のデータ行の番号で、プログラム中の
ループ変数の値を出力すれば良いでしょう。2番目のセルは商品の名前で、テー
ブル INVENTORYのフィールドGOODSの内容です。3番目のセルはデータ削除CGIへ
のリンクで、各データ行に対応するテーブルINVENTORYのフィールドSERIALの値
が埋め込まれています。フィールドSERIALはテーブル定義でも分かる通り唯一の
主キーのフィールドであり、テーブルINVENTORYの一意識別子です。

 チェックボックス+削除ボタンでやるとすれば、データ削除CGIへ渡すテーブ
ルの一意識別子はチェックボックスに仕込む事になります。


 この方法なら比較的楽には作れますが、DB操作のキーデータをHTMLに埋め込む
という生な方法なので、悪意ある操作が行われる事を前提とするインターネット
上のシステムでは使用すべきでありません。あくまでも社内システムとして、で
すね。また、複数のクライアントから同時に削除が行われる事の対応を取ってい
ません。マルチユーザ環境は消そうとしたデータが無い程度の実害は無い問題が
発生する程度と思いますが、一応シングルユーザ用です。



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



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

      9280 2004-04-23 13:32 [hiroyuki.A <tiro1@xx] 整数IDのデータ常に連番に                
      9281 2004-04-23 14:07 ┣[hiroshi nagasaka <h-]                                       
      9282 2004-04-23 19:05 ┣[hiroyuki.A <tiro1@xx]                                       
      9283 2004-04-23 19:40 ┃┣["片寄白王" <katayose]                                     
      9284 2004-04-23 20:10 ┃┃┗[ML account <ml@xxxxx]                                   
      9285 2004-04-23 22:01 ┃┣[Hirofumi Fujiwara <f]                                     
      9286 2004-04-23 22:03 ┃┣[dan <dango@xxxxxxxxx]                                     
      9287 2004-04-24 01:54 ┃┗["片寄白王" <katayose]                                     
      9288 2004-04-24 13:13 ┗[hiroyuki.A <tiro1@xx]                                       
->    9289 2004-04-24 15:33  ┗[ML account <ml@xxxxx]