- - PR -
オートインクリメントの値の取得
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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も自動的に与えられている。 | ||||
|
投稿日時: 2006-08-25 09:40
SQLServerのことは使ったことが無いので存じ上げないですが、トランザクション を開始しているならば、同一トランザクションのINSERTとINSERTの間に他の更新 処理の影響が出ることは無いと思うのですが。トランザクションのモードのような 物が設定できるならば、その可能性があるかもしれませんが。MAX関数内での集計 中の参照データに対するロックとかは掛からないとかなのかな?。 OracleのシーケンスからCURRVALで値を取るのと同じ動作をするSQLServer独自の 関数とかがあったりするのであれば、それを2つ目のフィールドに使ってしまう なんてことも出来たりして。 [ メッセージ編集済み 編集者: 小僧 編集日時 2006-08-25 09:43 ] | ||||
|
投稿日時: 2006-08-25 09:59
小僧さん、レスありがとうございます!
おっしゃるとおり、CURRVALに対応する関数として、SQL Serverでは@@IDENTITYもしくはSCOPE_IDENTITY()という関数が用意されているようでした!(ふたを開けてみれば全くシンプルなんですね、本当に無知ですいません。)トランザクションのことももっと勉強しなければいけませんね。。 色々教えていただいてありがとうございました! | ||||
|
投稿日時: 2006-08-25 12:05
一応、参考までに・・・
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=24750&forum=26 @@IDENTITYとSCOPE_IDENTITY()、微妙に違うので注意してくだせぇ 2005だとトリガじゃなくても inserted にアクセスできる模様 | ||||
|
投稿日時: 2006-08-28 05:59
トリガは使用していませんが、私の場合ですとSCOPE_IDENTITY()のほうが適当のようですね。
かめたろさん、ご親切にアドバイスをどうもありがとうございます。 |
1