Сгенерировать уникальный uuid для каждой строки в таблице с помощью Postgres

#postgresql

#postgresql

Вопрос:

Однако, несмотря на это, у меня есть ограничение UUID, установленное в качестве поля идентификатора в одной из моих таблиц (я думаю, из-за того, что uuid_generate_v4 создается только для UUID за транзакцию?) когда я импортировал загрузку данных CSV в свою таблицу, каждой строке в таблице был присвоен один и тот же UUID.

Я хочу иметь возможность изменить это и присвоить каждой строке уникальный UUID, однако запущенный

update monitors_nontest set id = uuid_generate_v1()

Опять же, для каждой строки создается только один UUID.

Как я могу изменить эту команду, чтобы каждая строка получала другой UUID?

Комментарии:

1. Не уверен, почему uuid_generate_v1() этого не происходит, но uuid_generate_v4() работает так, как вы ожидаете.

2. Разместите ответы на следующие вопросы в вашем исходном вопросе. Какая версия Postgres? Каково определение схемы для таблицы, в которую вы импортируете? Это: update monitors_nontest set id = uuid_generate_v1() вероятно, работает не так, как ожидалось, согласно документам «Это включает MAC-адрес компьютера и отметку времени». Я предполагаю, что он использует что-то подобное now() , что остается постоянным на протяжении всей транзакции.

3. @AdrianKlaver Прочитайте источник, ваше предположение неверно. Он вызывает функции внешней библиотеки. Было бы интересно узнать результат pg_config --configure , чтобы мы знали, какой --with-uuid вариант был выбран.

4. Для справки: я не могу воспроизвести это с помощью PGDG RPM в Fedora Linux. Они настроены с --with-uuid=e2fs помощью .

Ответ №1:

Просто возможность. Как вы на самом деле сгенерировали uuid? Функция uuid_generate_v1() фактически генерирует другое значение при каждом вызове. Но это ключ при каждом вызове. Кажется, что при вызове в рамках вложенного выбора оптимизатор Postgres может почувствовать, что он может обойти вызов и использовать кэшированный результат. Попробуйте следующее.

 create table uuid_gen( id1a uuid
                     , id1b uuid
                     , num1 integer
                     );
                 
insert into uuid_gen(num1) 
  select generate_series(1,50);

update uuid_gen set id1a = uuid_generate_v1();
update uuid_gen set id1b = (select uuid_generate_v1());

select count(distinct id1a), count(distinct id1b) from uuid_gen;
 

К сожалению, я не смог найти скриптовый процессор, в котором была бы доступна функция uuid_generate_v1(), ни uuid_generate_v4(), которая работала бы точно так же.