Właśnie zaimportowałem kilka danych do tabeli MySQL i mam kolumnę „GUID”, w której chcę w zasadzie wypełnić wszystkie istniejące wiersze nowymi i unikalnymi losowymi identyfikatorami GUID.
Jak to zrobić w MySQL?
próbowałem
UPDATE db.tablename
SET columnID = UUID()
where columnID is not null
I po prostu wszystkie pola są takie same
Odpowiedzi:
Nie jestem pewien, czy to najłatwiejszy sposób, ale działa. Chodzi o to, aby utworzyć wyzwalacz, który działa za Ciebie, a następnie wykonać zapytanie aktualizujące tabelę, a na końcu porzucić ten wyzwalacz:
Następnie wykonaj
Oraz
DROP TRIGGER beforeYourTableUpdate
;UPDATE Inne rozwiązanie, które nie używa wyzwalaczy, ale wymaga klucza podstawowego lub unikalnego indeksu:
UPDATE jeszcze raz: Wygląda na to, że Twoje pierwotne zapytanie również powinno działać (może nie potrzebujesz
WHERE columnID is not null
, więc cały mój wymyślny kod nie jest potrzebny.źródło
UUID
jest prawidłowo zaimplementowany (i uważam, że tak), powinno być możliwe utworzenie unikalnego indeksu bez sprawdzania duplikatów.Musiałem dodać kolumnę klucza podstawowego guid do istniejącej tabeli i wypełnić ją unikalnymi identyfikatorami GUID, a to zapytanie aktualizujące z wewnętrznym wyborem zadziałało:
Tak prosty :-)
źródło
UUID
jest generowany na podstawie maszyny i sygnatury czasowej . Jako zapytanie, które trwa milisekundy, musi być rzeczywiście bardzo, bardzo blisko ... ale nigdy tak samo ... dobrą rzeczą, aby Cię zapewnić, jest dodanieUNIQUE
indeksu do tej kolumny.UPDATE sri_issued_quiz SET quiz_id=uuid();
Zatwierdzone rozwiązanie tworzy unikalne identyfikatory, ale na pierwszy rzut oka wyglądają identycznie, tylko kilka pierwszych znaków się różni.
Jeśli chcesz mieć widoczne inne klucze, spróbuj tego:
Używam wersji serwera MySQL: 5.5.40-0 + wheezy1 (Debian)
źródło
SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')
Query nie jest zbyt ładne, ale spełnia swoje zadanie.źródło
Tylko drobny dodatek do zrobienia, ponieważ skończyło się na dziwnym wyniku, gdy próbowałem zmodyfikować UUID w trakcie ich generowania. Znalazłem odpowiedź u Rakesh być najprostszy, że działa dobrze, z wyjątkiem przypadków, w których chcesz się rozebrać kreski.
Na przykład:
To działało doskonale samodzielnie. Ale kiedy próbowałem tego:
Wtedy wszystkie otrzymane wartości były takie same (nie różniły się nieznacznie - czterokrotnie sprawdziłem
GROUP BY some_field
zapytaniem). Nie ma znaczenia, jak umieściłem nawiasy, dzieje się to samo.Wydaje się, że otaczając podzapytanie w celu wygenerowania UUID za pomocą polecenia REPLACE, uruchamia zapytanie UUID tylko raz, co prawdopodobnie ma sens jako optymalizacja dla znacznie mądrzejszych programistów niż ja, ale nie dla mnie.
Aby rozwiązać ten problem, po prostu podzieliłem go na dwa zapytania:
Oczywiście proste rozwiązanie, ale mam nadzieję, że pozwoli to komuś zaoszczędzić czas, który właśnie straciłem.
źródło
Wygląda na zwykłą literówkę. Czy nie chodziło Ci o „... gdzie columnId jest null”?
źródło
WHERE
klauzuli. Wygenerowane wartości są bardzo podobne, więc należy się im dokładnie przyjrzeć, aby zobaczyć, że rzeczywiście są różne.Miałem w większości ten sam problem. W moim przypadku uuid jest przechowywany jako BINARY (16) i ma NIE NULL UNIQUE ograniczenia. I napotkałem problem, gdy ten sam identyfikator UUID był generowany dla każdego wiersza, a ograniczenie UNIQUE na to nie pozwala. Więc to zapytanie nie działa:
UNHEX(REPLACE(uuid(), '-', ''))
Ale dla mnie zadziałało, gdy użyłem takiego zapytania z zagnieżdżonym wyborem wewnętrznym:
UNHEX(REPLACE((SELECT uuid()), '-', ''))
Następnie tworzony jest unikalny wynik dla każdego wpisu.
źródło
źródło
MYsql UPDATE nazwa tabeli SET columnName = UUID ()
oracle UPDATE nazwa tabeli SET nazwa_kolumny = SYS_GUID ();
SQLSERVER UPDATE nazwa tabeli SET columnName = NEWID () ;;
źródło
źródło