Генерировать GUID в MySQL для существующих данных?
Я только что импортировал кучу данных в таблицу MySQL, и у меня есть столбец "GUID", который я хочу в основном заполнить все существующие строки новыми и уникальными случайными GUID.
Как это сделать в MySQL ?
пробовал
UPDATE db.tablename
SET columnID = UUID()
where columnID is not null
и просто получить каждое поле то же самое
7 ответов:
Я не уверен, если это самый простой способ, но он работает. Идея состоит в том, чтобы создать триггер, который выполняет всю работу за вас, затем выполнить запрос, который обновляет вашу таблицу, и, наконец, удалить этот триггер:
delimiter // create trigger beforeYourTableUpdate BEFORE UPDATE on YourTable FOR EACH ROW BEGIN SET new.guid_column := (SELECT UUID()); END //выполнить
UPDATE YourTable set guid_column = (SELECT UUID());и
DROP TRIGGER beforeYourTableUpdate;обновление Другое решение, которое не использует триггеры, но требует первичного ключа или уникального индекса:
UPDATE YourTable, INNER JOIN (SELECT unique_col, UUID() as new_id FROM YourTable) new_data ON (new_data.unique_col = YourTable.unique_col) SET guid_column = new_data.new_idобновление в очередной раз: Кажется, что ваш исходный запрос также должен работать (возможно, вам не нужно
WHERE columnID is not null, так что все мои фантазии кода не требуется.
Мне нужно было добавить столбец первичного ключа guid в существующую таблицу и заполнить его уникальными GUID, и этот запрос на обновление с внутренним выбором работал для меня:
UPDATE sri_issued_quiz SET quiz_id=(SELECT uuid());Так Просто :-)
утвержденного решением создает уникальные идентификаторы, но на первый взгляд они одинаковые, только первые несколько символов отличаются.
Если вы хотите заметно разные ключи, попробуйте это:
update CityPopCountry set id = (select md5(UUID())); MySQL [imran@lenovo] {world}> select city, id from CityPopCountry limit 10; +------------------------+----------------------------------+ | city | id | +------------------------+----------------------------------+ | A Coruña (La Coruña) | c9f294a986a1a14f0fe68467769feec7 | | Aachen | d6172223a472bdc5f25871427ba64e46 | | Aalborg | 8d11bc300f203eb9cb7da7cb9204aa8f | | Aba | 98aeeec8aa81a4064113764864114a99 | | Abadan | 7aafe6bfe44b338f99021cbd24096302 | | Abaetetuba | 9dd331c21b983c3a68d00ef6e5852bb5 | | Abakan | e2206290ce91574bc26d0443ef50fc05 | | Abbotsford | 50ca17be25d1d5c2ac6760e179b7fd15 | | Abeokuta | ab026fa6238e2ab7ee0d76a1351f116f | | Aberdeen | d85eef763393862e5fe318ca652eb16d | +------------------------+----------------------------------+Я использую версию сервера MySQL: 5.5.40-0+wheezy1 (Debian)
похоже на простую опечатку. Разве вы не имели в виду .....где columnId и null"?
UPDATE db.tablename SET columnID = UUID() where columnID is null
просто небольшое дополнение, чтобы сделать, как я закончил со странным результатом при попытке изменить UUIDs, как они были сгенерированы. Я нашел ответ by Ракеш чтобы быть самым простым, что хорошо работало, за исключением случаев, когда вы хотите, чтобы лишить тире.
Для справки:
UPDATE some_table SET some_field=(SELECT uuid());это прекрасно работало само по себе. Но когда я попробовал это:
UPDATE some_table SET some_field=(REPLACE((SELECT uuid()), '-', ''));тогда все полученные значения были одинаковыми (не тонко различались - Я четверной проверил с помощью
GROUP BY some_fieldзапрос). Не имеет значения, как я расположил скобки, то же самое происходит.UPDATE some_table SET some_field=(REPLACE(SELECT uuid(), '-', ''));кажется, что при окружении подзапроса для создания UUID с заменой он запускает запрос UUID только один раз, что, вероятно, имеет смысл в качестве оптимизации для гораздо более умных разработчиков, чем я, но это не так.
чтобы решить эту проблему, я просто разбить его на два запроса:
UPDATE some_table SET some_field=(SELECT uuid()); UPDATE some_table SET some_field=REPLACE(some_field, '-', '');простое решение, очевидно, но надеюсь, это сэкономит кому-то время, которое я только что потерял.
я столкнулся в основном с той же проблемой. Im мой случай uuid хранится как двоичный (16) и не имеет нулевых уникальных ограничений. И я столкнулся с проблемой, когда один и тот же UUID был сгенерирован для каждой строки, и уникальное ограничение не позволяет этого. Так что этот запрос не работает:
UNHEX(REPLACE(uuid(), '-', ''))но для меня это сработало, когда я использовал такой запрос с вложенным внутренним select:
UNHEX(REPLACE((SELECT uuid()), '-', ''))тогда получается уникальный результат для каждой записи.
Comments