- PR -

SQLSERVERでオートナンバー枝番を作成するには?

1
投稿者投稿内容
sunameri
会議室デビュー日: 2005/09/18
投稿数: 2
投稿日時: 2005-09-18 18:12
MS SQLSERVER2000を使って、オートナンバー枝番を作成したいのですが、効率のよい方法を教えてください。

テーブルには、「年度」と「ID」という組み合わせで一意のIDとしたいと思っています。
「ID」は「年度」が変わると1番に初期化され、インクリメントされます。
オートナンバー型だと、「年度」〜の制御ができません。

INSERT SQL直前に SELECT MAX( ID ) AS NEW_ID FROM T_TEST WHERE ( NENDO = 2005 )
のようにMAX値をとれば対応できると思いますが、
 連続してINSERTを発行する場合には毎回のMAX関数は負荷となると思いますし、
 複数ユーザーからのINSERTがあった場合、タイミングによって同じMAX値を返す場合がある、
というようなことを想像しています。

現在は、「年度」「最大ID」を管理する別テーブルを持っておき、たとえば、100レコード連続追加する場合は、この管理テーブルのID値に+100をして、そのIDまでを予約するような方法をとっておりますが、時折、これもタイミングで失敗します。

Accessからの移行者で、SQL Serverについてはあまり詳しく理解していないのですが、何かよい方法(そもそもこういう機能を持っていて、使い方を知らないだけ?)など教えて頂けたら幸いです。
mso
ぬし
会議室デビュー日: 2003/12/04
投稿数: 496
お住まい・勤務地: 宮城
投稿日時: 2005-09-18 20:16
msoです。

引用:

sunameriさんの書き込み (2005-09-18 18:12) より:
MS SQLSERVER2000を使って、オートナンバー枝番を作成したいのですが、効率のよい方法を教えてください。

テーブルには、「年度」と「ID」という組み合わせで一意のIDとしたいと思っています。
「ID」は「年度」が変わると1番に初期化され、インクリメントされます。
オートナンバー型だと、「年度」〜の制御ができません。




おそらくはオートナンバーではそういうことは出来ないはずです。
やりたいので有れば2005年度テーブルを作成して、その中で
IDを取得するとかしかないのでは?

こんな設計したくないってのも分かりますが、
そうしないとできないと思います。
というか、普通にIDをオートナンバーで取得してしまえばいいのではないですか?
どんなデータ入力をするかわかりませんが、いまから2004年度のデータとか、
2006年のデータを大量にいれることはないと思いますが?

多少はIDの数字がずれてもいいんじゃないでしょうか?
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-09-18 21:41
採番テーブルを作るのがいいやり方だと思います。
これであれば重複する可能性はありません。
trapemiya
大ベテラン
会議室デビュー日: 2005/07/30
投稿数: 102
投稿日時: 2005-09-19 01:05
引用:

Anthyhimeさんの書き込み (2005-09-18 21:41) より:
採番テーブルを作るのがいいやり方だと思います。


私もそう思います。採番する時に採番テーブルだけに排他ロックをかけるだけですみますので、排他ロックの影響が少なくてすみます。
採番に使うだけですので、更新ロックではなく排他ロックで良いと思います。
sunameri
会議室デビュー日: 2005/09/18
投稿数: 2
投稿日時: 2005-09-19 10:22
みなさま、ありがとうございました。

引用:

sunameriさんの書き込み (2005-09-18 18:12) より:

現在は、「年度」「最大ID」を管理する別テーブルを持っておき、たとえば、100レコード連続追加する場合は、この管理テーブルのID値に+100をして、そのIDまでを予約するような方法をとっておりますが、時折、これもタイミングで失敗します。


上記が、採番テーブルですので、この仕組みを煮詰めるより他なさそうですね。
参考になりました、ありがとうございました。
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2005-09-22 18:29
select文の結果を直接insertする方法を使って
insert into T_TEST(ID)
SELECT MAX(ID)+1 AS NEW_ID FROM T_TEST WHERE ( NENDO = 2005 )
のような感じでいいと思います


OracleSQLパズル
http://oraclesqlpuzzle.hp.infoseek.co.jp
1

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