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

基于文档-'保证多个会话分配不同的序列值'

因此,您将获得不同的值,但取决于创建序列对象时指定的“缓存”设置,跨各种并发会话获得的值可能并不总是连续的。阅读有关序列的文档,尤其是“缓存”参数。

于 2011-05-10T09:58:43.080 回答
0

您对 currval 的使用完全可以

我不知道 SCOPE_IDENTITY() 所以我无法比较这两个概念。

顺便说一句:您的声明中不需要演员表:

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

足够的

于 2011-05-10T10:38:39.897 回答