- - PR -
SQLSERVERでオートナンバー枝番を作成するには?
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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についてはあまり詳しく理解していないのですが、何かよい方法(そもそもこういう機能を持っていて、使い方を知らないだけ?)など教えて頂けたら幸いです。 | ||||
|
投稿日時: 2005-09-18 20:16
msoです。
おそらくはオートナンバーではそういうことは出来ないはずです。 やりたいので有れば2005年度テーブルを作成して、その中で IDを取得するとかしかないのでは? こんな設計したくないってのも分かりますが、 そうしないとできないと思います。 というか、普通にIDをオートナンバーで取得してしまえばいいのではないですか? どんなデータ入力をするかわかりませんが、いまから2004年度のデータとか、 2006年のデータを大量にいれることはないと思いますが? 多少はIDの数字がずれてもいいんじゃないでしょうか? | ||||
|
投稿日時: 2005-09-18 21:41
採番テーブルを作るのがいいやり方だと思います。
これであれば重複する可能性はありません。 | ||||
|
投稿日時: 2005-09-19 01:05
私もそう思います。採番する時に採番テーブルだけに排他ロックをかけるだけですみますので、排他ロックの影響が少なくてすみます。 採番に使うだけですので、更新ロックではなく排他ロックで良いと思います。 | ||||
|
投稿日時: 2005-09-19 10:22
みなさま、ありがとうございました。
上記が、採番テーブルですので、この仕組みを煮詰めるより他なさそうですね。 参考になりました、ありがとうございました。 | ||||
|
投稿日時: 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
