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ż:
AUTOINCREMENTsł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 fullCode 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.