путаница между nextval и curval в PostgreSQL - PullRequest
1 голос
/ 10 мая 2011

Что произойдет, если несколько пользователей одновременно выполнят следующий запрос?

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'
);

Является ли этот метод таким же надежным, как SCOPE_IDENTITY () SQL SERVER?Любое предложение будет высоко оценено.

Ответы [ 3 ]

3 голосов
/ 10 мая 2011

currval() зависит от сессии. Если отдельный сеанс увеличивает вашу последовательность, currval () продолжит возвращать ожидаемое значение.

Тем не менее, вы можете использовать insert returning:

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

insert into bar (foo_id, ...) values (:id, ...),  (:id, ...), ...;
2 голосов
/ 10 мая 2011

На основании документации - «несколько сеансов гарантированно назначают разные значения последовательности»

Таким образом, вы получите разные значения, но в зависимости от настройки «кеша», указанной при создании объекта последовательности, значения, полученные черезразличные параллельные сеансы не всегда могут быть последовательными.Прочитайте документацию по sequence , особенно по параметру 'cache'.

0 голосов
/ 10 мая 2011

Вы прекрасно используете currval

Я не знаю SCOPE_IDENTITY (), поэтому я не могу сравнить эти два понятия.

Кстати: вам не нужен состав в вашем утверждении:

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

достаточно

...