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
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
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.
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.
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.
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 –
postaram się pisać z funkcji Odwrócone wieczorem. Unikalność jest gwarantowana, jeśli użyjesz primera, np. '1798672429' :) –
- 1. Tabela Mysql wyczerpana ids
- 2. mysql - TABELA FLUSH potrzebna?
- 3. Zagnieżdżona tabela w mysql
- 4. Aktualizacja MySql Dołączona tabela
- 5. Nazywanie kolumny identyfikatora MYSQL
- 6. mysql. Tabela „mysql” „innodb_table_stats” Nie znaleziono
- 7. Mapowanie NHibernate bez identyfikatora
- 8. Adres URL bez identyfikatora
- 9. Mysql: TABELA ODNÓW JEŚLI ISTNIEJĄ
- 10. Sposób sekwencyjnego uruchamiania specyfikacji
- 11. Doktryna - tabela bez kluczy podstawowych
- 12. Jedna tabela Mysql z wieloma kolumnami TIMESTAMP
- 13. Tabela = Tabela kontra Tabela. Tabela (Tabela)
- 14. Koncepcja punktu sekwencyjnego w java
- 15. MySQL: co to jest tabela tymczasowa?
- 16. Spadek przykręcona tabela w Mysql db
- 17. Błąd tworzenia tabeli MySQL - tabela nie istnieje
- 18. Czy tymczasowa tabela MySQL jest udostępnionym zasobem?
- 19. jak mysql tabela zmiana samo dzieło
- 20. Sprawdź, czy tabela MySQL istnieje lub nie
- 21. MySQL - Jak zamówić według odmiany? Tabela INNODB
- 22. Sprawdzanie, czy istnieje tabela na MySQL
- 23. Uzyskiwanie identyfikatora wkładki z wkładką PDO MySQL
- 24. Deklaracja SQLAlchemy: tabela bez kluczy podstawowych?
- 25. Dlaczego tworzyć puste (bez wierszy, bez kolumn) tabela w PostgreSQL
- 26. Umiarkowana wtyczka komentarzy bez identyfikatora aplikacji?
- 27. Jak odziedziczyć szablon bez identyfikatora w Odoo?
- 28. Uzyskiwanie następnego identyfikatora bez wstawiania wiersza
- 29. Fasola sprężynowa bez identyfikatora lub nazwy
- 30. Modelowanie obiektów bez identyfikatora w danych embera
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 –