2012-04-25 33 views
5

Czy istnieje możliwość uzyskania unikalną wartość datownika dla dla każdego rekordu w MySQL ?? ..mogę otrzymać unikalny znacznik czasu dla każdego rekordu w MySQL

stworzyłem przykładową tabelę

CREATE TABLE t1 (id int primary key, name varchar(50), 
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); 

i uruchomiono próbkę INSERTIONS i wydaje się, że wartości timestamp są duplikowane.

e.g insert into t1(id,name) values(1,"test"); 
+3

Chyba zapobiec rekordy z wprowadzonych w tym samym czasie, nie może być zduplikowane znaczniki czasu. –

+1

@MichaelMior Nie mogę zwiększyć "TIMESTAMP sensivity" ?? .. używając milisekundy itp? Marcus po prostu używając kwerendy Wybierz. gołym okiem widzę to. –

+0

MySQL nie obsługuje mikrosekund (ale, 5.6.4 będzie), więc sugerowałbym, żeby było pole z liczbami całkowitymi. – Kostis

Odpowiedz

6

Pewnego dnia wkrótce (5.6.4), MySQL dostarczy fractional seconds w kolumnach znacznika czasu, jednak nawet ułamków sekund nie są gwarantowane jest unikatowy, chociaż teoretycznie, że oni najbardziej często są wyjątkowe, szczególnie jeśli ograniczyłeś MySQL do pojedynczego wątku.

Możesz użyć numeru UUID, jeśli potrzebujesz unikalnego numeru, który jest zamówiony tymczasowo.

SELECT UUID() daje coś takiego:

45f9b8d6-8f00-11e1-8920-842b2b55ce56 

a jakiś czas później:

004b721a-8f01-11e1-8920-842b2b55ce56 

Pierwsze trzy porcje UUID składa się z czasem jednak są one w kolejności od najwyższej precyzji co najmniej, więc musisz odwrócić pierwsze trzy części, używając SUBSTR() i CONCAT() w ten sposób:

SELECT CONCAT(SUBSTR(UUID(), 15, 4), '-', SUBSTR(UUID(), 10, 4), 
    '-', SUBSTR(UUID(), 1, 8)) 

Plony:

11e1-8f00-45f9b8d6 

Najwyraźniej nie mógł użyć funkcji jak to jako wartość domyślną, więc trzeba by ustawić go w kodzie, ale jest to zagwarantowane unikalne czasowo nakazał wartość. Funkcja UUID() działa na znacznie niższym poziomie niż sekundy (cykle zegarowe), więc jest gwarantowana unikatowa dla każdego połączenia i ma niski narzut (bez blokowania, np. Auto_increment).

Używanie UUID() na serwerze bazy danych może być preferowane do korzystania z podobnej funkcji, takiej jak funkcja PHP microtime() na serwerze aplikacji, ponieważ serwer bazy danych jest bardziej scentralizowany. Możesz mieć więcej niż jeden serwer aplikacji (web), który może generować kolidujące wartości, a microtime() nadal nie gwarantuje unikatowych wartości.

+0

+1 świetne informacje. Nieliczne pytania jednak się pojawiły. W jaki sposób trzy pierwsze liczby gwarantują czasową kolejność? Instrukcja mówi tylko niejasno: "Pierwsze trzy liczby są generowane na podstawie znacznika czasu". Czy należy zawsze używać pełnego 'UUID' (tylko pierwsze trzy wartości odwrócone w celu zamówienia)? Gdzie znaleźć więcej informacji o tej funkcji. Instrukcja nie zawierała wzmianki o "najwyższej precyzji co najmniej"? –

+0

@ ZZ-bb, Podręcznik MySQL nie zawiera szczegółów, ponieważ używany format UUID to [standard] (http://pubs.opengroup.org/onlinepubs/9629399/toc.pdf). Czwarta część identyfikatora UUID zmieni się po każdym cofnięciu zegara. Ma to zapewnić unikalność wartości jako całości. Dopóki nie zadzierasz z zegarem, pierwsze trzy części są w porządku. –

2

Tak, jeśli nie wykonujesz dwóch lub więcej wstawek lub edycji w ciągu jednej sekundy. Jedynym problemem jest to, że wiele rzeczy można zrobić w ciągu sekundy, tj. Wiele wstawek lub automatycznych aktualizacji przy użyciu klauzuli where. To wyklucza proste rozwiązanie wymuszające unikatowe znaczniki czasu: dodawanie ograniczenia unique do kolumny timestamp.

Dlaczego numer timestamp powinien być unikatowy? Użyj auto increment lub coś innego, jeśli potrzebujesz unikatowy indeks itp

Jeśli potrzebujesz dokładniejszych wartości czasu niż timestamp, patrz:

+0

dzięki za opisową odpowiedź. Automatyczna inkrementacja nie zadziała w przypadku mojego problemu. Od czasu wykonania kwerendy aktualizacji. Wtedy nie mogę wykryć, że kolejność rekordów się zmieniła. Dlatego próbowałem użyć TIMESTAMP. –

+0

@Ashan Podczas wstawiania rekordów 'AI' zmienia kolejność. Ale edycja to już inna historia. Dlaczego edycja zamówienia ma znaczenie? Uważam, że główną funkcją 'timestamp' jest oznaczenie czasu, w którym zmiany wprowadzono do wiersza, aby wiedzieć, że wiersz został zmieniony po wstawieniu lub nie. Nie ujawniać kolejności zmian. Przechowywanie 'microtime' w niektórych kolumnach może być odpowiedzią, ale nie sądzę, że istnieje gwarancja, że ​​nawet ta wartość jest zawsze unikalna. Możesz wstawić 'date' lub' timestamp' + jakąś wartość policzalną edycji daty bieżącej. Ale znowu, jak śledzić zmiany? –

Powiązane problemy