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

Utwórz kolumnę automatycznego przyrostu w SQLite

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sformatuj wyniki SQLite jako JSON

  2. 3 sposoby na znalezienie wierszy zawierających małe litery w SQLite

  3. Konstruktor SQLiteOpenHelper() jest niezdefiniowany

  4. Wyświetlaj dane z bazy danych za pomocą adaptera bazowego i widoku listy

  5. Uzyskaj identyfikator wiersza tabeli SQLite FTS3