2011-09-27 20 views
5

Czy istnieje sposób utworzenia tabeli w MySql, która ma automatyczne pole ID, ale identyfikator nie jest sekwencyjny. Na przykład losowy lub pseudolosowy identyfikator. Znalazłem rozwiązania, które sugerują generowanie identyfikatora i próbuję wstawić go, dopóki nie zostanie znaleziony nieużywany ID (generating an sequential five digit alphanumerical ID). ale nic, co można zrobić bezpośrednio w definicji tabeli lub prostszej sztuczce.Tabela MySql bez identyfikatora sekwencyjnego

Odpowiedz

11

MySQL posiada natywną funkcję UUID() który wygeneruje unikatowy identyfikator globalny:

mysql> SELECT UUID(); 
    -> '6ccd780c-baba-1026-9564-0040f4311e29' 

Można przechowywać swoje wyjście w kolumnie CHAR(36).

INSERT INTO table (`uuid`, `col1`, `col2`) VALUES (UUID(), 'someval', 'someval'); 

Zgodnie z dokumentacją chociaż,

Chociaż UUID() wartości mają być unikalne, nie są one koniecznie unguessable lub nieprzewidywalne. Jeśli nieprzewidywalność jest wymagana, wartości UUID powinny być generowane w inny sposób.

Uzupełnienie Inną opcją jest UUID_SHORT() dla 64-bitowych unsigned INT zamiast polu znaków.

mysql> SELECT UUID_SHORT(); 
    -> 92395783831158784 
2

Czy klucz złożony działa? Standardowe standardowe pole auto_increment. Wstawiasz nowy rekord, pobierasz jego nowy identyfikator, a następnie mieszasz ten identyfikator z solą i aktualizujesz rekord z tą wartością skrótu.

Jeśli zrobisz to wszystko w ramach transakcji, wersja w toku rekordu bez skrótu nigdy nie będzie widoczna, dopóki nie zostanie wygenerowany skrót. I zakładając, że zrobiłeś właściwe solenie, wynikowa wartość mieszania będzie dla wszystkich celów i celów "przypadkowa".

Należy zauważyć, że nie można tego zrobić w jednym kroku, ponieważ wartość last_insert_id() w mysql nie jest aktualizowana nowym identyfikatorem, dopóki rekord nie zostanie faktycznie zapisany. Wartość pobrana podczas faktycznego etapu parowania insertów byłaby tym, co identyfikator został wstawiony PRZED tym.

1

Jedynym automatycznie generowanym wartością domyślną w dozwolonej definicji tabeli byłaby autoreklama (MySQL Guide).

Powinieneś być w stanie write a trigger zautomatyzować ten proces, może poprzez funkcję UUID, jak sugerował Michael.

+0

od pierwszego komentarza swojego łączu Utwórz TRIGGER sdata_insert przed włożeniem ON sometable dla każdego wiersza BEGIN SET NEW.guid = UUID(); END –

3

Ponieważ poprosiłeś trick, można używać wspólnego auto_incremented id i "fałszywy" ją przez pomnożenie z dużym prime (a następnie modulo 2^32): Wartości

CREATE TABLE AutoIncPrime 
(id int unsigned auto_increment primary key 
) ; 

INSERT, od 1 do 10:

INSERT INTO AutoIncPrime 
VALUES(),(),(),(),(),(),(),(),(),() ; 

SELECT * FROM AutoIncPrime ; 

wyjściowa:

id 
--- 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

fałszywy id, z a View:

CREATE VIEW AutoIncPrime_v AS 
    SELECT 
     ((id*1798672429) & 0xFFFFFFFF) 
      AS FakeUUID 
    FROM AutoIncPrime ; 

Pozwala zobaczyć nasze "UUID":

SELECT * FROM AutoIncPrime_v ; 

wyjściowa:

FakeUUID 
---------- 
1798672429 
3597344858 
1101049991 
2899722420 
403427553 
2202099982 
4000772411 
1504477544 
3303149973 
806855106 

Można nawet sprawiają, że wyglądają bardziej losowy z (bardziej skomplikowane nieco mieszanie) :

CREATE VIEW AutoIncPrime_v2 AS 
    SELECT 
     ( (((id*1798672429) & 0x55555555) << 1) 
      | (((id*1798672429) & 0xAAAAAAAA) >> 1) 
     ) 
     AS FakeUUID 
    FROM AutoIncPrime ; 

SELECT * FROM AutoIncPrime_v2 ; 

FakeUUID 
---------- 
2537185310 
3918991525 
2186309707 
1558806648 
604496082 
1132630541 
3719950903 
2791064212 
3369149034 
808145601 

Sztuką jest to, że nadal masz sekwencyjny id w tabeli - za pomocą którego można przyłączyć się do innych tabel. Po prostu nie pokazuj tego użytkownikom - ale pokaż tylko fałszywą.

Jeśli tabela jest dostać duży i obliczenia wolno, można dodać kolejną kolumnę w tabeli i zapisać wartość FakeUUID tam z wyzwalacz INSERT.

+0

super !!! Myślałem o tej metodzie, ale z najgorszymi funkcjami (bardziej skomplikowanymi, a nie mysql), więc dajesz mi wskaźnik. Ale a) nie widzę odwrotną drogę do prawdziwej tożsamości (bez wkładania go ze spustem, jak pan powiedział) można proszę pisać na odwrocie tej pięknymi funkcji? oraz b) co z wyjątkowością generowanych identyfikatorów (oczywiście w danym zakresie)? Nie mogę określić, jaki jest zakres dla tych funkcji, związanych z wybraną maską i primerem. naprawdę dziękuję i przepraszam za mój angielski –

+0

postaram się pisać z funkcji Odwrócone wieczorem. Unikalność jest gwarantowana, jeśli użyjesz primera, np. '1798672429' :) –

Powiązane problemy