Создать GUID в MySQL для существующих данных? - PullRequest
80 голосов
/ 08 июня 2011

Я только что импортировал кучу данных в таблицу MySQL, и у меня есть столбец «GUID», который я хочу заполнить всеми существующими строками новыми и уникальными случайными GUID.

Как мнесделать это в MySQL?

Я пытался

UPDATE db.tablename
  SET columnID = UUID()
  where columnID is not null

И просто получить все поля одинаковыми

Ответы [ 7 ]

92 голосов
/ 09 июля 2012

Мне нужно было добавить столбец первичного ключа guid в существующую таблицу и заполнить его уникальными GUID, и этот запрос на обновление с внутренним выбором работал для меня:

UPDATE sri_issued_quiz SET quiz_id=(SELECT uuid());

Так просто: -)

74 голосов
/ 08 июня 2011

Я не уверен, что это самый простой способ, но он работает.Идея состоит в том, чтобы создать триггер, который все работает за вас, затем выполнить запрос, который обновляет вашу таблицу, и, наконец, отбросить этот триггер:

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, поэтому весь мой модный код не нужен.

18 голосов
/ 23 декабря 2014

Утвержденное решение создает уникальные идентификаторы, но на первый взгляд они выглядят одинаково, отличаются только первые несколько символов.

Если вам нужны явно разные ключи, попробуйте это:

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 Server: 5.5.40-0 + wheezy1 (Debian)

8 голосов
/ 22 августа 2012
select @i:=uuid();
update some_table set guid = (@i:=uuid());
5 голосов
/ 01 апреля 2016

Просто небольшое дополнение, которое я сделал, поскольку я получил странный результат при попытке изменить UUID по мере их создания.Я нашел ответ от Ракеш самым простым, который работал хорошо, за исключением случаев, когда вы хотите удалить штрихи.

Для справки:

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, '-', '');

Очевидно, простое решение, но, надеюсь, это сэкономит кому-то время, которое я только что потерял.

4 голосов
/ 15 марта 2014

Похоже на простую опечатку. Разве вы не имели в виду "... где columnId равно null"?

UPDATE db.tablename
  SET columnID = UUID()
  where columnID is null
2 голосов
/ 23 февраля 2018

Я столкнулся в основном с той же проблемой. В моем случае uuid хранится как BINARY (16) и имеет ограничения NOT NULL UNIQUE. И я столкнулся с проблемой, когда один и тот же UUID был сгенерирован для каждой строки, и ограничение UNIQUE не позволяет этого. Так что этот запрос не работает:

UNHEX(REPLACE(uuid(), '-', ''))

Но для меня это сработало, когда я использовал такой запрос с вложенным внутренним выбором:

UNHEX(REPLACE((SELECT uuid()), '-', ''))

Затем выдается уникальный результат для каждой записи.

...