SQLite ma ciekawy sposób obsługi kolumn z autoinkrementacją. Przez kolumny autoinkrementacyjne rozumiem kolumny, które zwiększają się automatycznie po wstawieniu nowych danych.
Jest to podobne do IDENTITY
kolumna w SQL Server lub AUTO_INCREMENT
kolumna w MySQL
.
W tym artykule wyjaśniono, jak utworzyć AUTOINCREMENT
kolumny w SQLite.
Automatycznie utwórz kolumnę automatycznego przyrostu
Domyślnie, gdy definiujesz kolumnę jako INTEGER PRIMARY KEY
, będzie się automatycznie zwiększać za każdym razem, gdy wstawisz NULL do tej kolumny.
Przykład:
CREATE TABLE Cats(
CatId INTEGER PRIMARY KEY,
CatName
);
W tej tabeli CatId kolumna jest kolumną z autoinkrementacją. Dzieje się tak, ponieważ został zdefiniowany przy użyciu INTEGER PRIMARY KEY
.
Teraz, kiedy wstawiam NULL do tej kolumny, CatId automatyczne przyrosty kolumn:
INSERT INTO Cats VALUES
( NULL, 'Brush' ),
( NULL, 'Scarcat' ),
( NULL, 'Flutter' );
SELECT * FROM Cats;
Wynik:
CatId CatName ---------- ---------- 1 Brush 2 Scarcat 3 Flutter
Ważne jest, aby pamiętać, że możesz zastąpić AUTOINCREMENT
wartość, wstawiając własną wartość. Innymi słowy, AUTOINCREMENT
wstawia wartość tylko wtedy, gdy tego nie zrobisz.
Działa to tak, że NULL
jest automatycznie konwertowany na liczbę całkowitą, która jest o jeden większa od największej wartości tej kolumny we wszystkich innych wierszach tabeli. Jeśli tabela jest pusta, wartością będzie 1
.
Jeśli największa wartość kolumny jest największą możliwą liczbą całkowitą (9223372036854775807), SQLite wybierze losowo nieużywany klucz. Zwykle oznacza to, że ponownie użyje starych kluczy, które zostały wcześniej usunięte. Jeśli nie można znaleźć nieużywanego klucza, INSERT
operacja kończy się niepowodzeniem z SQLITE_FULL
błąd.
Zasadniczo oznacza to, że jeśli zezwolisz na DELETE
operacji w tabeli, nie ma gwarancji, że wszystkie wiersze będą w porządku. Istnieje możliwość, że niektóre wiersze będą miały wyższą wartość niż wiersze wstawione później.
Dlatego w takich przypadkach nie możesz polegać na tej kolumnie, jeśli chcesz uporządkować tabelę w kolejności rosnącej lub malejącej, na podstawie kolejności wstawiania wierszy.
Na szczęście, jeśli jest to dla Ciebie problem, istnieje rozwiązanie:AUTOINCREMENT
słowo kluczowe.
Użyj słowa kluczowego AUTOINCREMENT
Alternatywnie możesz wybrać opcję jawnego ustawienia kolumny na automatyczne zwiększanie za pomocą AUTOINCREMENT
słowo kluczowe.
Jedną z zalet korzystania z tej metody jest to, że gwarantuje ona, że wszystkie wiersze będą w porządku rosnącym. Dzieje się tak, ponieważ nie wykorzystuje ponownie wcześniej usuniętych kluczy. Każdy klucz będzie zawsze o jeden więcej niż największy klucz, jaki kiedykolwiek istniał w tej tabeli. Jeśli największy możliwy klucz istniał wcześniej w tej tabeli, to nie będzie spróbuj użyć wcześniej usuniętych kluczy. INSERT
nie powiedzie się z SQLITE_FULL
kod błędu.
Wadą używania AUTOINCREMENT
słowem kluczowym jest to, że używa dodatkowego procesora, pamięci, miejsca na dysku i narzutu we/wy dysku.
Oto przykład tworzenia kolumny z automatycznym przyrostem za pomocą AUTOINCREMENT
słowo kluczowe:
CREATE TABLE Dogs(
DogId INTEGER PRIMARY KEY AUTOINCREMENT,
DogName
);
Teraz wstaw dane i wybierz je:
INSERT INTO Dogs VALUES
( NULL, 'Yelp' ),
( NULL, 'Woofer' ),
( NULL, 'Fluff' );
SELECT * FROM Dogs;
Wynik:
DogId DogName ---------- ---------- 1 Yelp 2 Woofer 3 Fluff
Gdybym miał usunąć Fluff z tej tabeli, a następnie wstaw nowy wiersz (używając NULL
jako DogId), nowy DogId będzie miał wartość 4. Innymi słowy, nie zostanie ponownie użyty 3.
Jeśli kolumna została utworzona bez AUTOINCREMENT
słowo kluczowe, to w następnym wierszu zostanie ponownie użyty identyfikator DogId 3.
Jeśli miałbym wstawić DogId 9223372036854775807 (największą możliwą liczbę całkowitą), otrzymałbym następujący błąd przy następnym wstawieniu, które określa NULL
dla tej kolumny:
Error: database or disk is full
Mogę jednak jawnie wstawić wartość niższą niż 9223372036854775807, o ile ta wartość nie jest już używana przez inny wiersz, a INSERT
operacja powinna się powieść bez powyższego błędu.
Zasadniczo, gdy osiągniesz 9223372036854775807, automatyczny przyrost przestanie działać.
Kolumny zdefiniowane bez AUTOINCREMENT
słowo kluczowe nie ma tego problemu. Automatycznie powrócą i spróbują znaleźć nieużywaną liczbę całkowitą do użycia. Jeśli jednak użyto wszystkich liczb całkowitych (tj. tabela faktycznie zawiera 9223372036854775807 wierszy), to nawet te kolumny spowodują powyższy błąd.