- PR -

VB2005で自動採番

1
投稿者投稿内容
ゆうじ
常連さん
会議室デビュー日: 2008/01/28
投稿数: 31
お住まい・勤務地: 東京都
投稿日時: 2008-02-14 23:11
たびたび申し訳ありません。
VB2005+SQLSERVERで現在社員情報の管理ソフトを作成開発をしていますが、社員IDをACCESSの様なオートナンバーで登録したいと思ってるのですが、良い方法が見当たらなく困っております。何か良い方法はありませんでしょうか?
色々なサイトを調べたところ、select max(ID)で取得後+1をするとありましたが何か問題があるような事がかかれていました。(理解は出来なかったのですが)

よろしくお願いします。
いとっと
常連さん
会議室デビュー日: 2005/06/10
投稿数: 33
投稿日時: 2008-02-14 23:44
SQLServerのバージョンが不明ですが、2000以上であればこちらが参考になると思います。
(7.0以前は環境が無いので分かりません)

http://www.atmarkit.co.jp/fnetwork/rensai/sql11/sql1.html

identityで上記ページ内を検索してみてください。

引用:

色々なサイトを調べたところ、select max(ID)で取得後+1をするとありましたが何か問題があるような事がかかれていました。(理解は出来なかったのですが)



該当のデータがそのデータ型の取り得る最大値になるケースや、途中に番号の抜けが出てしまうケースでは少々問題がありそうです。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2008-02-15 09:18
引用:

いとっとさんの書き込み (2008-02-14 23:44) より:

引用:

色々なサイトを調べたところ、select max(ID)で取得後+1をするとありましたが何か問題があるような事がかかれていました。(理解は出来なかったのですが)



該当のデータがそのデータ型の取り得る最大値になるケースや、途中に番号の抜けが出てしまうケースでは少々問題がありそうです。


あとは max(ID) を取って、登録する前に別のクライアントなどからアクセス
された場合は、同じ値をとりうる可能性もありますね。
そうなるともはや ID の意味はなくなってしまうと思います。
なので、小手先のやり方よりはシステムで用意されている identity を利用
するのが素直かなぁと思います。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-02-15 10:01
直接の回答ではありませんが、
私自身も以前、必要に迫られて調べたことがあったので、
そのとき見つけた過去スレッドを貼っておきます。

シーケンスと採番テーブルの選択
ユニークなIDの自動生成
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2008-02-15 10:16
引用:

ゆうじさんの書き込み (2008-02-14 23:11) より:
色々なサイトを調べたところ、select max(ID)で取得後+1をするとありましたが何か問題があるような事がかかれていました。(理解は出来なかったのですが)


パフォーマンス上の問題。複数のセッションからデータのINSERTが行われる場合、IDの重複を避けるためにはロックをかけて一度に一つのセッションしか挿入できないように実装する必要がある。この部分がボトルネックになるために、複数の端末から大量にレコードが作られる場合にはパフォーマンスの悪さが問題になる。端末毎に連番となるレコードIDを割り当てるような形なら、パフォーマンス上はさして問題にはならない。

二つ目の問題はレコードの削除が行われる場合。最後に挿入したレコードが削除されると、同じIDのレコードが再び作られることになる。

大抵のデータベースはユニークIDを生成するための独自の仕組みを用意しているので、それを利用するのが良い。Accessならオートナンバーだし、MSSQLならidentity。
ゆうじ
常連さん
会議室デビュー日: 2008/01/28
投稿数: 31
お住まい・勤務地: 東京都
投稿日時: 2008-02-15 23:54
お世話になっております。
やはりidentityを設定することにします。
皆様大変ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)