Wiem, że MySQL ogranicza kolumny auto_increment do kluczy podstawowych. Dlaczego to? Moja pierwsza myśl jest taka, że jest to ograniczenie wydajności, ponieważ prawdopodobnie istnieje gdzieś jakaś tabela liczników, która musi zostać zablokowana, aby uzyskać tę wartość.
Dlaczego nie mogę mieć wielu kolumn auto_increment w tej samej tabeli?
Dzięki.
mysql
primary-key
auto-increment
Christopher Armstrong
źródło
źródło
Odpowiedzi:
Dlaczego chcesz mieć kolumnę auto_increment, która nie jest kluczem podstawowym?
Jeśli chcesz, aby kolumna była automatycznie zwiększana, z definicji nie przechowujesz znaczących danych w tej kolumnie. Jedynym przypadkiem, w którym sensowne jest przechowywanie nieistotnych informacji, jest szczególny przypadek, w którym chcesz mieć syntetyczny klucz podstawowy. W takim przypadku brak informacji jest zaletą, ponieważ nie ma ryzyka, że ktoś kiedykolwiek przyjdzie w przyszłości i będzie chciał zmienić dane, ponieważ zmienił się atrybut niektórych podmiotów.
Posiadanie wielu kolumn auto_increment w tej samej tabeli wydaje się jeszcze dziwniejsze. Dwie kolumny miałyby te same dane - są generowane przez ten sam algorytm i mimo wszystko zapełniane w tym samym czasie. Przypuszczam, że możesz wymyślić implementację, w której możliwe jest nieznaczne zsynchronizowanie, jeśli jest wystarczająca liczba jednoczesnych sesji. Ale nie mogę sobie wyobrazić, jak byłoby to przydatne w aplikacji.
źródło
W rzeczywistości atrybut AUTO_INCREMENT nie jest ograniczony do KLUCZA PODSTAWOWEGO (już więcej). Tak było w starych wersjach - zdecydowanie 3.23 i prawdopodobnie 4.0. Ciągle instrukcja MySQL dla wszystkich wersji, ponieważ 4.1 brzmi następująco
Tak więc rzeczywiście możesz mieć kolumnę AUTO_INCREMENT w tabeli, która nie jest kluczem podstawowym. Jeśli to ma sens, to inny temat.
Powinienem również wspomnieć, że kolumna AUTO_INCREMENT powinna zawsze być liczbą całkowitą (technicznie dopuszczalny jest również typ zmiennoprzecinkowy) i że powinna być NIEPISYKOWANA. Typ SIGNED nie tylko marnuje połowę miejsca na klucz, ale może również prowadzić do ogromnych problemów, jeśli przypadkowo wstawiona zostanie wartość ujemna.
Wreszcie MySQL 4.1 i nowsze definiują alias typu SERIAL dla BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
źródło
To interesujące pytanie, ponieważ różne bazy danych mają unikalne podejście do zapewniania auto_increment.
MySQL : Generowany jest tylko jeden klucz auto_increment w celu jednoznacznej identyfikacji wiersza w tabeli. Nie ma wielu wyjaśnień za tym, ale tylko wdrożenie. W zależności od typu danych wartości auto_increment są ustalane przez długość typu danych w bajtach:
PostgreSQL
Wewnętrzny szereg typów danych jest używany do automatycznego przyrostu od 1 do 2 147 483 647. Większe zakresy są dozwolone przy użyciu bigserial.
Oracle : Obiekt schematu o nazwie SEQUENCE może tworzyć nowe liczby, po prostu przywołując funkcję nextval. PostgreSQL ma również taki mechanizm.
Oto ładny URL, który podaje, w jaki sposób określają je inne bazy danych: http://www.w3schools.com/sql/sql_autoincrement.asp
Jeśli chodzi o twoje pytanie, jeśli naprawdę chcesz mieć wiele kolumn auto_increment w jednej tabeli, musisz to naśladować.
Dwa powody, dla których musisz to naśladować:
Jak byś to naśladował ???
Używanie wielu tabel, które mają tylko jedną kolumnę auto_increment i mapowanie ich na pożądane kolumny w tabelach docelowych. Oto przykład:
Skopiuj i wklej ten przykład:
Spowoduje to utworzenie tabeli popowych quizów dla nauczycieli. Stworzyłem również pięć emulatorów sekwencji, po jednym na każdy dzień tygodnia szkolnego. Każdy emulator sekwencji działa, wstawiając wartość 0 w kolumnie val. Jeśli emulator sekwencji jest pusty, zaczyna się od wartości 0, nextval 1. Jeśli nie, kolumna nextval jest zwiększana. Następnie możesz pobrać kolumnę nextval z emulatora sekwencji.
Oto przykładowe wyniki z przykładu:
Jeśli naprawdę potrzebujesz wielu wartości automatycznego przyrostu w MySQL, jest to najbliższy sposób na jego emulację.
Spróbuj !!!
AKTUALIZACJA 23.06.2011 21:05
Właśnie zauważyłem w moim przykładzie, że nie używam wartości @pop.
Tym razem zamieniłem „pop_tue = pop_tue + 1” na „pop_tue = @pop” i powtórzyłem przykład:
źródło
bigserial
typ danych, który oferuje zakres znacznie większy niż 2Jak mówi XL, nie ogranicza się to tylko do kluczy podstawowych. To potencjalne ograniczenie, że możesz mieć tylko jedną taką kolumnę na tabelę, ale najlepszym rozwiązaniem jest wygenerowanie tylu liczb, których potrzebujesz w innej tabeli, a następnie wstawienie ich tam, gdzie jest to konieczne.
źródło