Имеется таблица, в которой необходимо создать 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.
Правильное решение
Если нужно решить правильно, то, надеюсь, местные эксперты по хранимым процедурам наведут на правильное направление в другом ответе.
Комментариев нет:
Отправить комментарий