- PR -

オートインクリメントの値の取得

1
投稿者投稿内容
Furi2
ベテラン
会議室デビュー日: 2004/10/28
投稿数: 74
お住まい・勤務地: N.Hollywood/Agoura Hills
投稿日時: 2006-08-25 07:42
こんにちは、お世話になってます。初歩的な質問とは思いますが教えてください。

MS SQL Server 2000のストアドプロシージャで、2つのテーブルにそれぞれ1行ずつ追加をしたいと思っています。両テーブルとも、PKはオートインクリメントのフィールドを使っています。

わからないのは、一つ目のテーブルのオートインクリメントで与えられた値を、2つ目のテーブルの値として使いたいのですが、どうやって取得すればいいのでしょうか???

1つ目Insertステートメントの直後にMAX()を使って、という方法もあるかもしれないのですが、もしほぼ同時に複数ユーザーがInsertしようとしたら??と思うと、それではまずい気もしました。

こういったときはそもそもオートインクリメントを使わないほうがいいのでしょうか?それとも何かスタンダードな方法があるのでしょうか。。どうかご教授願います!

Table1のフィールド :
key_1_1 (オートインクリメント),
field_1_1
Table2のフィールド :
key_2_1 (オートインクリメント),
key_2_2 (Table1でinsertした行のkey_1_1の値),
field_2_1


Create Procedure ...
AS

insert into Table1 ( field_1 ) values ( "value1" );
-- ここで key_1_1 フィールドに自動的に番号が振られる。

insert into Table2 ( key_2_2, field_2_1 ) value ( [[ここが問題]], "value2" )
-- key_2_1も自動的に与えられている。
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2006-08-25 09:40
引用:

1つ目Insertステートメントの直後にMAX()を使って、という方法もあるかもしれないのですが、もしほぼ同時に複数ユーザーがInsertしようとしたら??と思うと、それではまずい気もしました。


SQLServerのことは使ったことが無いので存じ上げないですが、トランザクション
を開始しているならば、同一トランザクションのINSERTとINSERTの間に他の更新
処理の影響が出ることは無いと思うのですが。トランザクションのモードのような
物が設定できるならば、その可能性があるかもしれませんが。MAX関数内での集計
中の参照データに対するロックとかは掛からないとかなのかな?。
OracleのシーケンスからCURRVALで値を取るのと同じ動作をするSQLServer独自の
関数とかがあったりするのであれば、それを2つ目のフィールドに使ってしまう
なんてことも出来たりして。


[ メッセージ編集済み 編集者: 小僧 編集日時 2006-08-25 09:43 ]
Furi2
ベテラン
会議室デビュー日: 2004/10/28
投稿数: 74
お住まい・勤務地: N.Hollywood/Agoura Hills
投稿日時: 2006-08-25 09:59
小僧さん、レスありがとうございます!

おっしゃるとおり、CURRVALに対応する関数として、SQL Serverでは@@IDENTITYもしくはSCOPE_IDENTITY()という関数が用意されているようでした!(ふたを開けてみれば全くシンプルなんですね、本当に無知ですいません。)トランザクションのことももっと勉強しなければいけませんね。。

色々教えていただいてありがとうございました!
かめたろ
ぬし
会議室デビュー日: 2003/03/20
投稿数: 255
投稿日時: 2006-08-25 12:05
一応、参考までに・・・
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24750&forum=26
@@IDENTITYとSCOPE_IDENTITY()、微妙に違うので注意してくだせぇ

2005だとトリガじゃなくても inserted にアクセスできる模様
Furi2
ベテラン
会議室デビュー日: 2004/10/28
投稿数: 74
お住まい・勤務地: N.Hollywood/Agoura Hills
投稿日時: 2006-08-28 05:59
トリガは使用していませんが、私の場合ですとSCOPE_IDENTITY()のほうが適当のようですね。

かめたろさん、ご親切にアドバイスをどうもありがとうございます。
1

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