- PR -

ユニークキー生成

投稿者投稿内容
SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-05-11 12:45
こんにちは。

ASP.NET(VB)
.NET Framework v1.1

テーブルの主キーがオートナンバーだけとなっているものがあって、
そこへレコードを追加した直後にそのレコードを取得したいのですが
主キーがオートナンバーで分からないため、レコードを取得出来ませ
ん。レコードを取得できれば何の問題もないのですが。。。。

そこで、主キーをオートナンバーでなく、ユニークなキーにしよう、
と考えました。以前ColdFusionやJavaなどをかじった事がありまし
て、ユニークなキーを自動で生成してくれるクラスが存在しました。
.NETでは、そのように自動でユニークなキーを生成してくれるクラス
は存在するのでしょうか?

ご存知の方がおられましたらよろしくお願い致します。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-05-11 13:07
引用:

レコードを取得できれば何の問題もないのですが。。。。



SQLServerであれば、

INSERT INTO テーブル名 (列名) VALUES (値); SELECT * FROM テーブル名 WHERE (連番 = SCOPE_IDENTITY())
ほげた
ベテラン
会議室デビュー日: 2002/05/08
投稿数: 67
お住まい・勤務地: なごやん
投稿日時: 2005-05-11 13:11
はじめまして。

テーブルとは DataTable のことですか? DB側のテーブルのことですか?

DataTableであれば、NewRow() するとローオブジェクトをもらえるので、オートナンバーにしておいたほうが簡単そうです。
DBテーブルの場合、SQL Serverしかわからないのですが、トリガなどで連鎖的なINSERTがされなければ、@@IDENTITYで最後のIDを参照できます。

自前でユニークなキーを、ということであれば、整数型にしておいて MAX(カラム)+1 とする手もありますし、GUIDを使う手もあります。どちらにしろ、トランザクションやユニーク性のチェックが必要となりそうですが・・・
SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-05-11 13:17
返信ありがとうございます。

>テーブルとは DataTable のことですか? DB側のテーブルのことですか?

DB側のテーブルの事です。誤解を招くような書き方してすいませんでした。


todoさん、ほげたさんのおっしゃるようにIDENTITYを使用してみます。

本当にありがとうございました。
ほげた
ベテラン
会議室デビュー日: 2002/05/08
投稿数: 67
お住まい・勤務地: なごやん
投稿日時: 2005-05-11 13:18
todoさんのおっしゃるように、@@IDENTITYでなくSCOPE_IDENTITY()を使ったほうがよいですね。
失礼しました。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-05-11 13:46
どもです。がると申します。
んっと。言語フリーな発言になるのですが。
わたしは、よくユニークキーに、以下のようなものを使ってます。
# 数字と数値を一緒くたに扱ってますので言語によってはご注意のほどを
# イメージはPerlです
コード:
$time = エポックタイム取得:秒;
$pid = プロセスID;
$msec = マイクロ秒取得
$key = $time . $pid . $msec;



実際には桁数をそろえたり(マイクロ秒で、0パディングしたりします)、
桁数が多いのでBASE64ちっくなエンコードをかけたりしていますが。
上記であれば、ほぼ確実にユニークなkeyが作成できます。
「それでも不安」な方は、threadでユニークなID、適当な桁数の乱数を
併用するって手もあります。

厳密にはINSERTでのチェックが必要とはいえ、上記で「実際に」keyが
重複したためしは一度もありません。
# マイクロ秒単位で処理がそろうこと自体が相当マレですし :-P

「いますでにあるクラス」を探すのもよいのですが、たまには自作も
いかがでしょうか? などと時代に逆行するような発言で締めくくってみたり :-P
SE卵
大ベテラン
会議室デビュー日: 2004/10/22
投稿数: 135
投稿日時: 2005-05-11 13:59
がるがるさん、返信ありがとうございます。

確かに独自のユニークキー作成クラスを作ることも考えました。
しかし、少し自信がなかったので今回は省きました。時間ある
ときにでもやろうと思います。

貴重な情報ありがとうございます。

todoさん、ほげたさんのSCOPE_IDENTITYを使用し、一応実装
できました。思い通りに動いてくれています。

だけどこれって、もし別のマシンから同時にレコードが追加さ
れた場合って大丈夫なんですかね?念のため、トランザクション
かけた方がよさそうですね。
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-05-11 14:31
SE卵さん、こんにちは。

引用:

だけどこれって、もし別のマシンから同時にレコードが追加さ
れた場合って大丈夫なんですかね?念のため、トランザクション
かけた方がよさそうですね。


お手元に SQL Server Books Online はありませんか?

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