MySQL - Zmień tabelę, aby automatycznie wstawić UUID

14

Ok, wiem, że już to robiłem. Ale nie mogę tego zrozumieć. Stworzyłem stół. Jedna z kolumn ma identyfikator „LogID”, jest także kluczem podstawowym.

Jak to zmienić, aby ta kolumna generowała identyfikator UUID dla każdego nowego wpisu?

Dzięki

Matt Winer
źródło

Odpowiedzi:

17

Wystarczy utworzyć wyzwalacz do uruchomienia przed wstawieniem, aby wygenerować identyfikator UUID dla danej kolumny.

CREATE TRIGGER before_insert_mytable
  BEFORE INSERT ON mytable
  FOR EACH ROW
  SET new.LogID = uuid();
Robert Gabriel
źródło
3

Wyrażenie UUID () generuje UUID po wywołaniu.

Niestety (w każdym razie AFAIK) MySQL nie zezwala na wyrażenia jako wartość domyślną dla pola. Aby obejść ten problem, zawsze można ustawić pole na wartość domyślną null i mieć wyzwalacz, który aktualizuje pole o UUID przy wstawianiu.

ydaetskcoR
źródło
2

Jestem prawie pewien, że tak naprawdę nie możesz . Poważnie zastanowiłbym się nad niestosowaniem UUID jako klucza podstawowego, zamiast używania cieńszego, ładniejszego typu danych INT. Możesz dodać swój UUID jako osobną kolumnę i zaktualizować go za pomocą a TRIGGER, jeśli ci to odpowiada.

Avarkx
źródło
Liczby całkowite rozkładają się, jeśli potrzebujesz, aby rekordy były unikalne w całej bazie danych.
Cfreak
1
Podejrzewam, że istnieje większy projekt modelu lub wybrany problem z narzędziem, jeśli wymagania dyktują model przechowywania silnika na tym poziomie. Posiadanie UUID jako oddzielnej kolumny jest w tym przypadku najlepszym rozwiązaniem obu światów.
Avarkx
UUID staje się wzdęty po sformatowaniu dla ludzi. Jeśli chcesz użyć UUID jako klucza podstawowego, usuń myślniki i usuń zaznaczenie. Jeśli potrzebujesz wersji sformatowanej przez człowieka, możesz dodać wygenerowaną kolumnę do tabeli. SELECT LENGTH(UNHEX(REPLACE(UUID(),'-','')))= 16 bajtów binarnych. Wciąż większy niż, INTale znacznie lepszy niżVARCHAR(36)
miknik
Zła rada, miknik. Twoja baza danych skaluje się strasznie, jeśli użyjesz UUID jako klucza podstawowego. Może również mieć 16 oddzielnych kolumn liczb całkowitych jako złożony klucz podstawowy. I mnóstwo fragmentacji indeksów! Twój klucz podstawowy jest teraz losowy. Jeśli tak, nie używaj kluczy obcych. Połączenia zmieniają się z O (n) na O (n ^ 2). Dwa połączenia od O (n log10 (n)) do O (n ^ 3). Zamień n na 100 000 i odejmij różnicę.
TamusJRoyce,
2

Właśnie zdecydowałem się dołączyć polecenie UUID () do wstawki z mojej aplikacji.

Dziękuje wszystkim.

Matt Winer
źródło