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

290
22 июня 2017, 04:22

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

Answer 1

Что делаете вы:

  1. Находите все записи без uuid
  2. Генерируете один какой-то UUID
  3. Каждую запись пытаетесь этим 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.

Правильное решение

Если нужно решить правильно, то, надеюсь, местные эксперты по хранимым процедурам наведут на правильное направление в другом ответе.

READ ALSO
Оптимизация MySQL SELECT запроса

Оптимизация MySQL SELECT запроса

ДрузьяИмеется следующий запрос:

282
Как скопировать данные из одной ячейки в другую?

Как скопировать данные из одной ячейки в другую?

Но вот только с одним условием если ячейка в которую копируют равна nullИ так есть таблица goods в кторой есть столбцы create_at и update_at

271
Изменить условие INNER JOIN, если будет NULL

Изменить условие INNER JOIN, если будет NULL

Чисто для вашего понимания напишу рандомные таблицы:

228
не могу понять как реализовать файловую систему sql

не могу понять как реализовать файловую систему sql

Не хочу сделать на сайте для пользователей файловую систему папка+файл например пользователь создал папку "home" в ней папка "user" и так далее...

240