Страницы

Поиск по вопросам

понедельник, 8 июля 2019 г.

SQL - Дубликаты при использовании UPDATE и REPLACE(UUID())

Имеется таблица, в которой необходимо создать UUID бинарного формата (binary(16)) для старых записей, которым он не задан. Выполняю запрос:
UPDATE `table` SET uuid=UNHEX(REPLACE(UUID(), '-', '')) WHERE uuid IS NULL;
И после обновления лишь одной записи получаю подобные ошибки:
Дублирующаяся запись '\x8B';\xA6T\xAE\x11\xE7\x9B\x0F\xF0yYry\xD5' по ключу 'uuid'
Подобное поведение наблюдается только при наличии REPLACE в запросе. Товарищи специалисты, подскажите решение этой проблемы, пожалуйста.


Ответ

Что делаете вы:
Находите все записи без uuid Генерируете один какой-то UUID Каждую запись пытаетесь этим UUID обновить.
Если представить что ваш UUID, как среднее случайно число, равен четырём, то вы пытаетесь сделать примерно следующее:
UPDATE `table` SET uuid=4 WHERE uuid IS NULL;
Естественно возникает ошибка.
У этой проблемы есть правильные решения, и есть быстрые.
Быстрое решение
Если быстро, то можно выдумать свой собственный UUID, который вычисляется как функция от уникальной части строки в БД. Например, от её ID:
UPDATE `table` SET `uuid` = UNHEX(MD5(CONCAT(UUID(), `id`))) WHERE `uuid` IS NULL;
Так, каждая запись будет обновляться своим собственным, в какой-то мере случайным, UUID.
Правильное решение
Если нужно решить правильно, то, надеюсь, местные эксперты по хранимым процедурам наведут на правильное направление в другом ответе.

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

Отправить комментарий