Hasilkan GUID di MySQL untuk Data yang ada?

100

Saya baru saja mengimpor sekumpulan data ke tabel MySQL dan saya memiliki kolom "GUID" yang pada dasarnya ingin saya isi semua baris yang ada dengan GUID acak yang baru dan unik.

Bagaimana saya melakukan ini di MySQL?

Saya mencoba

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

Dan dapatkan setiap bidang yang sama

Tom
sumber
2
apakah kamu benar-benar yakin, mereka sama? Saya sudah mencoba, sebagian besar karakternya sama, tetapi ada sedikit perbedaan pada uuid yang dihasilkan
xiaoyifang
Ya, saya mengonfirmasi, itu sama!
Cyril N.
Ini berhasil untuk saya - perbedaannya kecil, tetapi ada. Cara tercepat untuk memeriksanya adalah dengan menambahkan batasan UNIK ke kolom.
PSU

Jawaban:

88

Saya tidak yakin apakah itu cara termudah, tetapi berhasil. Idenya adalah untuk membuat pemicu yang melakukan semuanya untuk Anda, kemudian, untuk mengeksekusi kueri yang memperbarui tabel Anda, dan akhirnya melepaskan pemicu ini:

delimiter //
create trigger beforeYourTableUpdate  BEFORE UPDATE on YourTable
FOR EACH ROW
BEGIN
  SET new.guid_column := (SELECT UUID());
END
//

Kemudian jalankan

UPDATE YourTable set guid_column = (SELECT UUID());

Dan DROP TRIGGER beforeYourTableUpdate;

PERBARUI Solusi lain yang tidak menggunakan pemicu, tetapi membutuhkan kunci utama atau indeks unik:

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 sekali lagi: Tampaknya kueri asli Anda juga harus berfungsi (mungkin Anda tidak perlu WHERE columnID is not null, jadi semua kode mewah saya tidak diperlukan.

a1ex07
sumber
ya, itu harus bekerja bahkan di 5.0. Tapi jangan lupa untuk menjatuhkan pelatuknya!
a1ex07
ya tentu :) hanya ingin tahu apakah saya perlu memeriksa duplikat setelahnya atau apakah ini akan membuat nilai unik untuk setiap baris di kolom?
Tom
Jika UUIDditerapkan dengan benar (dan saya yakin demikian), Anda harus dapat membuat indeks unik tanpa memeriksa duplikat.
a1ex07
Saya memperbarui jawaban saya dengan pendekatan lain yang mungkin juga berguna.
a1ex07
2
kode asli Anda akan berfungsi, cukup ubah columnId = UUID () menjadi columnId = (SELECT UUID ()). Bekerja dengan baik untuk saya. semua nilai yang dihasilkan hampir sama tetapi masing-masing unik.
EJay
111

Saya memiliki kebutuhan untuk menambahkan kolom kunci utama panduan dalam tabel yang ada dan mengisinya dengan GUID unik dan kueri pembaruan ini dengan pilihan dalam ini berfungsi untuk saya:

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

Sangat sederhana :-)

Rakesh Prajapati
sumber
35
Awalnya saya pikir ini telah menyisipkan UUID duplikat karena semuanya dimulai dan diakhiri sama, tetapi sebenarnya sedikit berbeda.
Sam Barnum
3
@SamBarnum karena UUIDdibuat berdasarkan mesin dan stempel waktu . Sebagai kueri yang memerlukan waktu milidetik untuk dijalankan, kueri tersebut harus sangat dekat ... tetapi tidak pernah sama ... hal yang baik untuk meyakinkan Anda, adalah menambahkan UNIQUEindeks ke kolom itu.
balexandre
2
Jawaban yang diterima tampaknya berlebihan dibandingkan dengan ini!
Xtreme Biker
4
Setidaknya di mariadb (10.1.26) ini sepertinya tidak berfungsi, memberikan uuid yang sama untuk setiap rekaman.
johanvdw
4
Ini menghasilkan UUID yang sama pada setiap record untuk saya, mungkin karena itu ada di subquery dan MySQL akan mengeksekusi query dalam terlebih dahulu dan menggunakan nilai yang sama untuk semua baris. Untuk mengatasinya, hapus subkueri:UPDATE sri_issued_quiz SET quiz_id=uuid();
Chris White
22

Solusi yang disetujui memang membuat ID unik, tetapi sekilas terlihat identik, hanya beberapa karakter pertama yang berbeda.

Jika Anda menginginkan kunci yang terlihat berbeda, coba ini:

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 |
+------------------------+----------------------------------+

Saya menggunakan versi MySQL Server: 5.5.40-0 + wheezy1 (Debian)

Imran-Inggris
sumber
5
Dalam kasus saya, saya membutuhkan tanda hubung di GUID yang dihasilkan. Saya menggunakan ini: SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')Kueri tidak terlalu bagus tetapi berhasil.
solo
9
Bukankah md5 kurang unik dari UUID? Saya khawatir tentang tabrakan.
Adam
15
select @i:=uuid();
update some_table set guid = (@i:=uuid());
Brad Johnson
sumber
1
sempurna sempurna sempurna !! Hal sekecil itu bisa berdampak besar !!
thekosmix
5

Hanya tambahan kecil untuk dibuat karena saya berakhir dengan hasil yang aneh ketika mencoba memodifikasi UUID saat dibuat. Saya menemukan jawaban oleh Rakesh menjadi sederhana yang bekerja dengan baik, kecuali dalam kasus di mana Anda ingin strip strip.

Sebagai referensi:

UPDATE some_table SET some_field=(SELECT uuid());

Ini bekerja dengan sendirinya dengan sempurna. Tetapi ketika saya mencoba ini:

UPDATE some_table SET some_field=(REPLACE((SELECT uuid()), '-', ''));

Kemudian semua nilai yang dihasilkan sama (tidak sedikit berbeda - saya empat kali lipat memeriksa dengan GROUP BY some_fieldkueri). Tidak peduli bagaimana saya menempatkan tanda kurung, hal yang sama terjadi.

UPDATE some_table SET some_field=(REPLACE(SELECT uuid(), '-', ''));

Tampaknya saat mengelilingi subkueri untuk menghasilkan UUID dengan REPLACE, itu hanya menjalankan kueri UUID sekali, yang mungkin masuk akal sebagai pengoptimalan bagi pengembang yang jauh lebih cerdas daripada saya, tetapi tidak bagi saya.

Untuk mengatasi ini, saya hanya membaginya menjadi dua kueri:

UPDATE some_table SET some_field=(SELECT uuid());
UPDATE some_table SET some_field=REPLACE(some_field, '-', '');

Solusi sederhana, jelas, tapi mudah-mudahan ini akan menyelamatkan seseorang dari waktu yang hilang.

enobrev
sumber
4

Sepertinya salah ketik. Bukankah yang Anda maksud adalah "... di mana columnId adalah null"?

UPDATE db.tablename
  SET columnID = UUID()
  where columnID is null
evan.leonard
sumber
1
Saya memiliki pemikiran yang sama ketika saya membaca pertanyaan, tetapi saya tidak berpikir demikian: sepertinya kolomnya berisi nilai, tetapi bukan nilai UNIK. Jawaban yang diberikan jauh sebelum jawaban Anda sudah menunjukkan apa yang dibutuhkan. Seharusnya tidak ada WHEREklausul. Dan nilai-nilai yang dihasilkan sangat mirip, sehingga harus dilihat lebih dekat untuk melihat bahwa keduanya memang berbeda.
ToolmakerSteve
3

Saya menghadapi sebagian besar masalah yang sama. Im kasus saya uuid disimpan sebagai BINARY (16) dan TIDAK memiliki kendala UNIK NULL. Dan saya menghadapi masalah ketika UUID yang sama dibuat untuk setiap baris, dan kendala UNIK tidak memungkinkan ini. Jadi kueri ini tidak berfungsi:

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

Tetapi bagi saya itu berhasil, ketika saya menggunakan kueri seperti itu dengan pemilihan dalam bersarang:

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

Kemudian dihasilkan hasil yang unik untuk setiap entri.

Oleksandr Korniienko
sumber
1
UPDATE db.tablename SET columnID = (SELECT UUID()) where columnID is not null
Ashutosh Niranjan
sumber
2
Harap tambahkan beberapa penjelasan tentang cara kerja kode Anda. Kode tanpa komentar tidak selalu mudah dipahami oleh pengguna SO lainnya
Simas Joneliunas
Jika Anda ingin mengupdate uuid pada data yang sudah ada, jalankan query seperti di atas dengan kondisi Anda.
Ashutosh Niranjan
0

MYsql UPDATE tablename SET columnName = UUID ()

Oracle UPDATE tablename SET columnName = SYS_GUID ();

SQLSERVER UPDATE tablename SET columnName = NEWID () ;;

Hugo R
sumber
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()));
Leonardo Filipe
sumber