Создать GUID в MySQL для существующих данных?
Я только что импортировал кучу данных в таблицу MySQL, и у меня есть столбец "GUID", который я хочу в основном заполнить все существующие строки новым и уникальным случайным GUID.
Как это сделать в MySQL?
Я пробовал
UPDATE db.tablename
SET columnID = UUID()
where columnID is not null
И просто получите каждое поле в том же
Ответы
Ответ 1
Я не уверен, что это самый простой способ, но он работает. Идея заключается в создании триггера, который все работает для вас, а затем для выполнения запроса, который обновляет вашу таблицу, и, наконец, для удаления этого триггера:
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
Другое решение, которое не использует триггеры, но требует первичного ключа или уникального индекса:
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
UPDATE еще раз:
Кажется, что ваш исходный запрос также должен работать (возможно, вам не нужен WHERE columnID is not null
, поэтому весь мой модный код не нужен.
Ответ 2
Мне нужно было добавить столбец первичного ключа guid в существующей таблице и заполнить его уникальным GUID, и этот запрос обновления с внутренним выбором работал у меня:
UPDATE sri_issued_quiz SET quiz_id=(SELECT uuid());
Так просто: -)
Ответ 3
Утвержденное решение действительно создает уникальные идентификаторы, но на первый взгляд они выглядят одинаково, отличаются только первые несколько символов.
Если вы хотите явно разные клавиши, попробуйте следующее:
update CityPopCountry set id = (select md5(UUID()));
MySQL [[email protected]] {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 Server: 5.5.40-0 + wheezy1 (Debian)
Ответ 4
select @i:=uuid();
update some_table set guid = (@i:=uuid());
Ответ 5
Похож на простую опечатку. Разве вы не имели в виду "... где columnId равно null"?
UPDATE db.tablename
SET columnID = UUID()
where columnID is null
Ответ 6
Просто небольшое дополнение, которое я получал, когда у меня получился странный результат при попытке изменить UUID по мере их создания. Я нашел ответ Rakesh самым простым, который работал хорошо, за исключением случаев, когда вы хотите для удаления тире.
Для справки:
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 с REPLACE, он запускает только запрос UUID один раз, что, вероятно, имеет смысл как оптимизация для более умных разработчиков, чем я, но это не помогло мне.
Чтобы решить эту проблему, я просто разделил ее на два запроса:
UPDATE some_table SET some_field=(SELECT uuid());
UPDATE some_table SET some_field=REPLACE(some_field, '-', '');
Простое решение, очевидно, но, надеюсь, это сэкономит кому-то время, которое я только что потерял.