Створити GUID в MySQL для існуючих даних?


100

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

Як це зробити в MySQL?

я намагався

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

І просто отримайте кожне поле однаковим


2
Ви справді впевнені, вони однакові? Я спробував, більшість персонажів однакові, але є кілька відмінностей у створеному uuid
xiaoyifang

Так, підтверджую, це те саме!
Кирило Н.

Це працює для мене - відмінності незначні, але вони є. Найшвидший спосіб перевірки - це додати UNIQUE обмеження до стовпця.
БД

Відповіді:


88

Я не впевнений, чи це найпростіший спосіб, але це працює. Ідея полягає в тому, щоб створити тригер, який виконує всю роботу для вас, а потім виконати запит, який оновлює вашу таблицю, і, нарешті, скинути цей тригер:

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, тому весь мій фантазійний код не потрібен.


так, це повинно працювати навіть у 5.0. Але не забудьте скинути курок!
a1ex07

так, точно :) просто цікаво, чи потрібно мені перевіряти дублікати після того, чи це створить унікальні значення для кожного рядка в стовпці?
Том

Якщо UUIDвоно реалізовано належним чином (і я вважаю, що воно є), ви зможете створити унікальний індекс, не перевіряючи наявність дублікатів.
a1ex07

Я оновив свою відповідь іншим підходом, який також може бути корисним.
a1ex07

2
ваш вихідний код буде працювати, просто змініть columnId = UUID () на columnId = (SELECT UUID ()). Відмінно працював для мене. всі згенеровані значення дуже близькі до однакових, але кожне унікальне.
EJay,

111

У мене виникла потреба додати стовпчик основного ключа до існуючої таблиці та заповнити його унікальними GUID, і цей запит на оновлення із внутрішнім виділенням працював для мене:

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

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


35
Спочатку я подумав, що це вставило повторювані UUID, тому що всі вони починаються і закінчуються однаково, але насправді вони трохи відрізняються.
Sam Barnum

3
@SamBarnum, оскільки UUIDгенерується на основі машини та позначки часу . Як запит, який триває мілісекунди, вони дійсно повинні бути дуже близькими ... але ніколи не однаковими ... гарно, запевнити вас, це додати UNIQUEіндекс до цього стовпця.
balexandre

2
Прийнята відповідь здається непосильним порівняно з цим!
Xtreme Biker

4
Принаймні, в mariadb (10.1.26) це, мабуть, не працює, даючи однаковий uuid для кожного запису.
johanvdw

4
Це генерувало однаковий UUID у кожному записі для мене, імовірно тому, що він знаходиться в підзапиті, і MySQL спочатку виконає внутрішній запит і використає одне і те ж значення для всіх рядків. Щоб вирішити це питання, видаліть підзапит:UPDATE sri_issued_quiz SET quiz_id=uuid();
Chris White

22

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

Якщо вам потрібні помітно різні клавіші, спробуйте наступне:

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)


5
У моєму випадку мені знадобилися дефіси у створеному GUID. Я використовував це: SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')Запит не дуже гарний, але він робить свою роботу.
сольно

9
Чи не md5 менш унікальний, ніж UUID? Я б хвилювався про зіткнення.
Адам

15
select @i:=uuid();
update some_table set guid = (@i:=uuid());

1
ідеальний ідеальний ідеальний !! така дрібниця може мати величезний вплив !!
thekosmix

5

Лише незначне доповнення, яке я зробив, коли я виявив дивний результат, коли намагався змінити 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

Виглядає як проста помилка. Ви не мали на увазі "... де columnId є нульовим"?

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

1
У мене була така ж думка, коли я читав запитання, але я не думаю: звучить так, ніби його стовпці містять значення, але не УНІКАЛЬНІ значення. Відповіді, дані задовго до того, як ваша відповідь уже показує, що потрібно. Не повинно бути WHEREпункту. І отримані значення дуже схожі, тому треба уважно їх переглянути, щоб побачити, що вони справді різні.
ToolmakerSteve

3

Я стикався здебільшого з тим же питанням. В моєму випадку uuid зберігається як BINARY (16) і не має НУЛЬНИХ УНІКАЛЬНИХ обмежень. І я зіткнувся з проблемою, коли для кожного рядка створювався один і той же UUID, і UNIQUE обмеження не дозволяє цього. Отже, цей запит не працює:

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

Але для мене це спрацювало, коли я використовував такий запит із вкладеним внутрішнім виділенням:

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

Потім виробляється унікальний результат для кожного входу.


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

2
Будь ласка, додайте пояснення щодо роботи вашого коду. Код без коментарів не завжди легко зрозуміти для інших користувачів SO
Сімас Йонеліунас,

якщо ви хочете оновити uuid в існуючих даних, запустіть запит, як зазначено вище, відповідно до вашої умови.
Ашутош Ніранджан

0

MYsql UPDATE ім'я таблиці SET columnName = UUID ()

oracle UPDATE ім'я таблиці SET columnName = SYS_GUID ();

SQLSERVER UPDATE ім'я таблиці SET columnName = NEWID () ;;


0
// UID Format: 30B9BE365FF011EA8F4C125FC56F0F50
UPDATE `events` SET `evt_uid` = (SELECT UPPER(REPLACE(@i:=UUID(),'-','')));

// UID Format: c915ec5a-5ff0-11ea-8f4c-125fc56f0f50
UPDATE `events` SET `evt_uid` = (SELECT UUID());

// UID Format: C915EC5a-5FF0-11EA-8F4C-125FC56F0F50
UPDATE `events` SET `evt_uid` = (SELECT UPPER(@i:=UUID()));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.