SQLite
 sql >> Baza danych >  >> RDS >> SQLite

AUTOMATYCZNE WZROST SQLite

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 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLite JSON_GROUP_ARRAY()

  2. 2 sposoby na usunięcie zduplikowanych wierszy w SQLite

  3. Pula połączeń dla bazy danych „/data/data/msv_database.db” nie może nawiązać połączenia. Połączenia:0 aktywnych, 1 nieaktywnych, 0 dostępnych

  4. Jak zapisać wartości rzeczywiste SQLite w wartościach Java BigDecimal?

  5. Wybór SQLite