PostgreSQL UUID поколения - PullRequest
       1

PostgreSQL UUID поколения

10 голосов
/ 04 августа 2011
select uuid_generate_v4() as one, uuid_generate_v4() as two;

«один» uuid и «два» uuid равны!

CREATE TABLE "TB"
(
  "Id" uuid NOT NULL DEFAULT uuid_generate_v4(),
  "Title" character varying NOT NULL,
   CONSTRAINT "TB_Class_ID" PRIMARY KEY ("Id")
);

postgresql 9.0 pgAdmin 1.12.3

insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111');
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111');
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111');

или

insert into "TB" ("Title") values ('111');
insert into "TB" ("Title") values ('111');
insert into "TB" ("Title") values ('111');

результат:

ERROR:  duplicate key value violates unique constraint "TB_Class_ID"
DETAIL:  Key ("Id")=(12ab6634-995a-4688-9a9a-ee8c3fe24395) already exists.

тогда

postgreSQL maestro 9.2.0.4

insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111');
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111');
insert into "TB" ("Id", "Title") values (uuid_generate_v4(), '111');

результат: затронуты 1 строка;

Я понимаю, что маэстро добавил записи одну за другой, но почему uuid_generate_v4 () возвращает одно и то же значение после двух вызовов? (В случае pgAdmin).

А как добавить несколько строк одним запросом?

Ответы [ 3 ]

13 голосов
/ 06 августа 2011

В какой-то момент в прошлом функции uuid_generate_* были ошибочно помечены как IMMUTABLE, что приводило к поведению, которое вы показываете. Это было исправлено во всех последних второстепенных версиях, но вам нужно перезапустить сценарий установки (uuid-ossp.sql), чтобы получить обновленные определения функций. (Вы также можете заглянуть в скрипт установки, чтобы убедиться, что у вас установлена ​​последняя версия. Функции должны быть помечены VOLATILE.)

11 голосов
/ 04 августа 2011

Внутри данной транзакции функция uuid_generate_v4() возвращает одно и то же значение.

Когда операторы группируются и выполняются как «одна команда», существует одна транзакция, поэтому каждый вызов uuid_generate_v4() будетвернуть то же значение.

Два способа «исправить» это:

  1. Делать отдельные вызовы базы данных каждый раз, когда вы используете функцию (это проще всего)
  2. Используйте соединение без автоматической фиксации, где вы управляете транзакциями и разделяете каждое использование в паре BEGIN; COMMIT (это хлопотно - не делайте этого, если вам не нужно)
0 голосов
/ 05 августа 2011
begin ISOLATION LEVEL READ UNCOMMITTED;
insert into "TB" ("Title") values ('111');
insert into "TB" ("Title") values ('111');
insert into "TB" ("Title") values ('111');
commit;

тоже возможно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...