Podsumowanie :w tym samouczku dowiesz się o SQLite AUTOINCREMENT
atrybut kolumny i kiedy użyć go w tabeli.
Wprowadzenie do SQLite ROWID
stół
Za każdym razem, gdy tworzysz tabelę bez określenia WITHOUT ROWID
opcja, otrzymasz niejawną kolumnę auto-inkrementacji o nazwie rowid
. rowid
kolumna przechowuje 64-bitową liczbę całkowitą ze znakiem, która jednoznacznie identyfikuje wiersz w tabeli.
Zobaczmy następujący przykład.
Najpierw utwórz nową tabelę o nazwie people
który ma dwie kolumny:first_name,
i last_name
:
CREATE TABLE people (
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Wypróbuj
Po drugie, wstaw wiersz do people
tabeli przy użyciu następującego INSERT
oświadczenie:
INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');
Code language: SQL (Structured Query Language) (sql)
Wypróbuj
Po trzecie, zapytaj o dane od people
tabeli przy użyciu następującego SELECT
oświadczenie:
SELECT
rowid,
first_name,
last_name
FROM
people;
Code language: SQL (Structured Query Language) (sql)
Wypróbuj
Jak widać wyraźnie z danych wyjściowych, SQLite niejawnie tworzy kolumnę o nazwie rowid
i automatycznie przypisuje wartość całkowitą za każdym razem, gdy wstawiasz nowy wiersz do tabeli.
Pamiętaj, że możesz również odwołać się do rowid
kolumna używająca jej aliasów:_rowid_
i oid
.
Kiedy tworzysz tabelę, która ma INTEGER PRIMARY KEY
kolumna, ta kolumna jest aliasem rowid
kolumna.
Poniższa instrukcja upuszcza tabelę people
i odtwarza go. Tym razem jednak dodajemy kolejną kolumnę o nazwie person_id
którego typ danych to INTEGER
a ograniczeniem kolumny jest PRIMARY KEY
:
DROP TABLE people;
CREATE TABLE people (
person_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Wypróbuj
W tym przypadku person_id
kolumna jest w rzeczywistości rowid
kolumna.
W jaki sposób SQLite przypisuje wartość całkowitą do rowid
? kolumna?
Jeśli nie określisz rowid
wartość lub używasz NULL
wartość po wstawieniu nowego wiersza, SQLite automatycznie przypisuje następną sekwencyjną liczbę całkowitą, która jest o jedną większą niż największy rowid
na stole. rowid
wartość zaczyna się od 1.
Maksymalna wartość rowid
kolumna to 9,223,372,036,854,775,807
, który jest bardzo duży. Jeśli twoje dane osiągną tę maksymalną wartość i spróbujesz wstawić nowy wiersz, SQLite znajdzie nieużywaną liczbę całkowitą i użyje jej. Jeśli SQLite nie może znaleźć żadnej nieużywanej liczby całkowitej, wygeneruje SQLITE_FULL
błąd. Ponadto, jeśli usuniesz kilka wierszy i wstawisz nowy, SQLite spróbuje ponownie użyć rowid
wartości z usuniętych wierszy.
Zróbmy na tym test.
Najpierw wstaw wiersz z maksymalną wartością do people
tabela.
INSERT INTO people (person_id,first_name,last_name)
VALUES( 9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Wypróbuj
Po drugie, wstaw kolejny wiersz bez określania wartości dla person_id
kolumna:
INSERT INTO people (first_name,last_name)
VALUES('William','Gate');
Code language: SQL (Structured Query Language) (sql)
Wypróbuj
Jak wyraźnie pokazano na wyjściu, nowy wiersz otrzymał nieużywaną liczbę całkowitą.
Rozważ inny przykład.
Najpierw utwórz nową tabelę o nazwie t1
który ma jedną kolumnę:
CREATE TABLE t1(c text);
Code language: SQL (Structured Query Language) (sql)
Po drugie, wstaw kilka wierszy do t1
tabela:
INSERT INTO t1(c) VALUES('A');
INSERT INTO t1(c) values('B');
INSERT INTO t1(c) values('C');
INSERT INTO t1(c) values('D');
Code language: SQL (Structured Query Language) (sql)
Po trzecie, zapytaj o dane z t1
tabela:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Po czwarte, usuń wszystkie wiersze t1
tabela:
DELETE FROM t1;
Code language: SQL (Structured Query Language) (sql)
Po piąte, wstaw kilka wierszy do t1
tabela:
INSERT INTO t1(c) values('E');
INSERT INTO t1(c) values('F');
INSERT INTO t1(c) values('G');
Code language: SQL (Structured Query Language) (sql)
Na koniec zapytaj o dane z t1
tabela:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Jak widać, wiersze 1, 2 i 3 zostały ponownie użyte w nowych wierszach.
SQLite AUTOINCREMENT
atrybut kolumny
SQLite zaleca, aby nie używać AUTOINCREMENT
atrybut, ponieważ:
AUTOINCREMENT
słowo kluczowe nakłada dodatkowy procesor, pamięć, miejsce na dysku i obciążenie we/wy dysku i należy go unikać, jeśli nie jest to ściśle potrzebne. Zwykle nie jest to potrzebne.
Ponadto sposób, w jaki SQLite przypisuje wartość do AUTOINCREMENT
kolumna nieco inna niż w przypadku rowid
kolumna.
Rozważ następujący przykład.
Najpierw upuść i odtwórz people
stół. Tym razem używamy AUTOINCREMENT
kolumna atrybutów:
DROP TABLE people;
CREATE TABLE people (
person_id INTEGER PRIMARY KEY AUTOINCREMENT,
first_name text NOT NULL,
last_name text NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Wypróbuj
Po drugie, wstaw wiersz z maksymalnym rowid
wartość do people
tabela.
INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Wypróbuj
Po trzecie, wstaw kolejny wiersz do people
tabela.
INSERT INTO people (first_name,last_name)
VALUES('John','Smith');
Code language: SQL (Structured Query Language) (sql)
Wypróbuj
Tym razem SQLite wysłał komunikat o błędzie, ponieważ person_id
kolumna nie wykorzystała ponownie numeru, jak rowid
kolumna.
[Err] 13 - database or disk is full
Code language: SQL (Structured Query Language) (sql)
Kiedy należy użyć AUTOINCREMENT
atrybut kolumny?
Główny cel używania atrybutu AUTOINCREMENT
ma na celu uniemożliwienie SQLite ponownego użycia wartości, która nie była używana lub wartości z poprzednio usuniętego wiersza.
Jeśli nie masz takich wymagań, nie powinieneś używać AUTOINCREMENT
atrybut w kluczu podstawowym.
W tym samouczku nauczyłeś się, jak SQLite AUTOINCREMENT
atrybut działa i jak wpływa na sposób, w jaki SQLite przypisuje wartości do kolumny klucza głównego.