MySQL - Alter table untuk secara otomatis memasukkan UUID

14

Ok, saya tahu saya pernah melakukan ini sebelumnya. Tetapi saya tidak bisa seumur hidup saya memahaminya. Saya membuat tabel. Salah satu kolom diberi label "LogID", itu juga merupakan kunci utama.

Bagaimana saya mengubahnya sehingga kolom ini menghasilkan UUID untuk setiap entri baru?

Terima kasih

Matt Winer
sumber

Jawaban:

17

Cukup buat pemicu untuk dijalankan sebelum menyisipkan untuk menghasilkan UUID untuk kolom yang diberikan.

CREATE TRIGGER before_insert_mytable
  BEFORE INSERT ON mytable
  FOR EACH ROW
  SET new.LogID = uuid();
Robert Gabriel
sumber
3

The UUID () ekspresi menghasilkan UUID saat dipanggil.

Sayangnya (bagaimanapun juga AFAIK) MySQL tidak akan mengizinkan ekspresi sebagai nilai default untuk sebuah bidang. Sebagai solusi, Anda selalu dapat mengatur bidang ke default nol dan memiliki pemicu yang memperbarui bidang dengan UUID saat disisipkan.

ydaetskcoR
sumber
2

Saya cukup yakin Anda masih tidak bisa , sebenarnya. Saya dengan serius mempertimbangkan untuk tidak menggunakan UUID sebagai kunci utama, melainkan menggunakan tipe data yang lebih ramping dan lebih bagus INT. Anda dapat menambahkan UUID Anda sebagai kolom terpisah dan memperbaruinya melalui a TRIGGER, jika itu cocok untuk Anda.

Avarkx
sumber
Integer rusak jika Anda membutuhkan catatan untuk menjadi unik di basis data Anda.
Cfreak
1
Saya menduga ada desain model yang lebih besar atau masalah alat yang dipilih jika persyaratan mendikte pola penyimpanan mesin pada tingkat itu. Memiliki UUID sebagai kolom terpisah sebenarnya adalah solusi terbaik dari kedua dunia dalam kasus ini.
Avarkx
UUID akan kembung begitu diformat untuk manusia. Jika Anda ingin menggunakan UUID sebagai kunci utama, cabut tanda garis dan hapus tautannya. Jika Anda membutuhkan versi yang diformat manusia, Anda bisa menambahkan kolom yang dibuat ke tabel. SELECT LENGTH(UNHEX(REPLACE(UUID(),'-','')))= 16 byte biner. Masih lebih besar dari INTtetapi jauh lebih baik daripadaVARCHAR(36)
miknik
Saran yang buruk, miknik. Basis data Anda akan sangat berskala jika Anda menggunakan UUID sebagai kunci utama. Mungkin juga memiliki 16 kolom bilangan bulat terpisah sebagai kunci utama majemuk. Dan indeks fragmentasi berlimpah! Kunci utama Anda sekarang acak. Jika ya, jangan gunakan kunci asing. Bergabung berubah dari O (n) ke O (n ^ 2). Dua bergabung dari O (n log10 (n)) ke O (n ^ 3). Ganti n dengan 100.000 dan kurangi selisihnya.
TamusJRoyce
2

Saya baru saja memutuskan untuk memasukkan perintah UUID () pada sisipan dari aplikasi saya.

Terima kasih semuanya.

Matt Winer
sumber