MySQL - Otomatik olarak bir UUID koymak için tablo değiştirme


14

Tamam, bunu daha önce yaptığımı biliyorum. Ama hayatım boyunca anlayamıyorum. Bir masa oluşturdum. Sütunlardan biri "LogID" olarak etiketlenir, aynı zamanda birincil anahtardır.

Bu sütunun her yeni giriş için bir UUID oluşturacağı şekilde nasıl değiştirebilirim?

Teşekkürler

Yanıtlar:


17

Verilen sütun için UUID'yi oluşturmak üzere eklemeden önce çalıştırmak için bir tetikleyici oluşturmanız yeterlidir.

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

3

UUID'si () çağrıldığında ifadesi UUID oluşturur.

Maalesef (zaten AFAIK) MySQL, ifadelerin alan için varsayılan değer olarak kullanılmasına izin vermiyor. Bir çözüm olarak, alanı her zaman varsayılan null değerine ayarlayabilir ve eklerken bir UUID ile güncelleştiren bir tetikleyiciye sahip olabilirsiniz.


2

Aslýnda hala yapamayacađýndan eminim . Ciddi dikkate alacağını değil bunun yerine daha ince gibi güzel veri türü kullanılarak, birincil anahtar olarak UUID kullanarak INT. UUID'nizi ayrı bir sütun olarak ekleyebilir ve TRIGGERsize uygunsa a ile güncelleyebilirsiniz .


Veritabanınızda benzersiz olması için kayıtlara ihtiyacınız varsa tamsayılar parçalanır.
Cfreak

1
Gereksinimler motor depolama düzenini bu düzeyde dikte ederse, daha büyük bir model tasarımı veya seçilen araç sorunu olduğundan şüphelenirim. Ayrı bir sütun olarak UUID'ye sahip olmak aslında bu durumda her iki dünyanın çözümünün en iyisidir.
Avarkx

UUID insanlar için biçimlendirildikten sonra şişirilir. Bir UUID'yi birincil anahtar olarak kullanmak istiyorsanız, tire işaretlerini çıkarın ve etiketini kaldırın. İnsan biçimli sürüme ihtiyacınız varsa, tabloya oluşturulan bir sütun ekleyebilirsiniz. SELECT LENGTH(UNHEX(REPLACE(UUID(),'-','')))= 16 bayt ikili. Hala daha büyük INTama çok daha iyiVARCHAR(36)
miknik

Kötü tavsiye, miknik. Birincil anahtar olarak bir UUID kullanırsanız veritabanınız korkunç bir şekilde ölçeklenir. Bileşik birincil anahtar olarak 16 ayrı tamsayı sütunu da olabilir. Ve dizin parçalanma bolca! Birincil anahtarınız artık rastgele. Bunu yaparsanız, yabancı anahtar kullanmayın. Birleşimler O (n) 'den O (n ^ 2)' ye değişir. O (n log10 (n)) 'den O (n ^ 3)' e iki birleşim. N'yi 100.000 ile değiştirin ve farkı çıkarın.
TamusJRoyce

2

Sadece UUID () komutunu uygulamamdan eklemeye karar verdim.

Herkese teşekkürler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.