2

複数のユーザーが同時に次のクエリを実行するとどうなりますか?

INSERT INTO "Retail"."Attributes"("AttributeId","AttributeCode","AttributeName")
VALUES(nextval('"Retail"."CompoundUnits_CompoundUnitId_seq"'::regclass),'COL','Color');

INSERT INTO "Retail"."AttributeDetails"  
  ("AttributeId","AttributeDetailCode","AttributeDetailName")
VALUES
(
  currval('"Retail"."CompoundUnits_CompoundUnitId_seq"'::regclass), 'COL-Red', 'Color Red'
),
(
  currval('"Retail"."CompoundUnits_CompoundUnitId_seq"'::regclass), 'COL-Blu', 'Color Blue'
), 
(
  currval('"Retail"."CompoundUnits_CompoundUnitId_seq"'::regclass), 'COL-Gre', 'Color Green'
);

これは、SQL SERVER の SCOPE_IDENTITY() と同じくらい信頼できる方法ですか? どんな提案でも大歓迎です。

4

3 に答える 3

4

currval()セッション固有です。別のセッションがシーケンスをインクリメントする場合、currval() は引き続き期待値を返します。

それはあなたが使いたいかもしれないと言ったinsert returning

insert into foo values (...) returning id;

insert into bar (foo_id, ...) values (:id, ...),  (:id, ...), ...;
于 2011-05-10T10:11:33.210 に答える
2

ドキュメントに基づく-「複数のセッションは、異なるシーケンス値を割り当てることが保証されています」

したがって、個別の値が得られますが、シーケンス オブジェクトの作成中に指定された「キャッシュ」設定によっては、さまざまな同時セッションで取得された値が常に連続しているとは限りません。シーケンス、特に 'cache' パラメータのドキュメントを読んでください。

于 2011-05-10T09:58:43.080 に答える
0

currval の使用は完全に問題ありません

SCOPE_IDENTITY() がわからないので、2 つの概念を比較できません。

ところで:ステートメントにキャストは必要ありません:

currval('"Retail"."CompoundUnits_CompoundUnitId_seq"')

十分です

于 2011-05-10T10:38:39.897 に答える