#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(), которая работала бы точно так же.