SQLite
 sql >> база данни >  >> RDS >> SQLite

Създайте колона за автоматично увеличение в SQLite

SQLite има интересен начин за работа с колони с автоматично увеличение. Под автоматично нарастващи колони имам предвид колони, които се увеличават автоматично, когато се вмъкнат нови данни.

Това е подобно на IDENTITY колона в SQL Server или AUTO_INCREMENT колона в MySQL .

Тази статия обяснява как да създадете AUTOINCREMENT колони в SQLite.

Автоматично създаване на колона с автоматично увеличение

По подразбиране, когато дефинирате колона като INTEGER PRIMARY KEY , той автоматично ще се увеличава, когато вмъкнете NULL в тази колона.

Пример:

CREATE TABLE Cats( 
    CatId INTEGER PRIMARY KEY, 
    CatName
);

В тази таблица CatId колоната е колона с автоматично увеличение. Това е така, защото е дефиниран с помощта на INTEGER PRIMARY KEY .

Сега, когато вмъкна NULL в тази колона, CatId автоматични увеличения на колони:

INSERT INTO Cats VALUES 
    ( NULL, 'Brush' ),
    ( NULL, 'Scarcat' ),
    ( NULL, 'Flutter' );

SELECT * FROM Cats;

Резултат:

CatId       CatName   
----------  ----------
1           Brush     
2           Scarcat   
3           Flutter   

Важно е да се отбележи, че можете да замените AUTOINCREMENT стойност, като вмъкнете своя собствена стойност. С други думи, AUTOINCREMENT вмъква стойност само ако не го направите.

Начинът, по който работи, е NULL автоматично се преобразува в цяло число, което е едно по-голямо от най-голямата стойност на тази колона спрямо всички останали редове в таблицата. Ако таблицата е празна, стойността ще бъде 1 .

Ако най-голямата стойност на колоната е възможно най-голямото цяло число (9223372036854775807), тогава SQLite ще избере неизползван ключ на случаен принцип. Това обикновено означава, че ще използва повторно стари ключове, които са били изтрити преди това. Ако неизползван ключ не може да бъде намерен, INSERT операцията е неуспешна с SQLITE_FULL грешка.

По принцип това означава, ако разрешите DELETE операции в таблицата, тогава няма гаранция, че всички редове ще бъдат в ред. Има възможност някои редове да имат по-висока стойност от редовете, вмъкнати на по-късна дата.

Следователно в такива случаи не можете да разчитате на тази колона, ако трябва да подредите таблицата във възходящ или низходящ ред, въз основа на реда, в който са били вмъкнати редовете.

За щастие, ако това е проблем за вас, има решение:AUTOINCREMENT ключова дума.

Използвайте ключовата дума AUTOINCREMENT

Като алтернатива можете да изберете изрично да зададете колоната да се увеличава автоматично, като използвате AUTOINCREMENT ключова дума.

Едно предимство от използването на този метод е, че той гарантира, че всички редове ще бъдат във възходящ ред. Това е така, защото не използва повторно изтрити ключове. Всеки ключ винаги ще бъде един повече от най-големия ключ, който някога е съществувал в тази таблица. Ако най-големият възможен ключ преди е съществувал в тази таблица, тогава няма опитайте се да използвате предварително изтрити ключове. INSERT ще се провали с SQLITE_FULL код за грешка.

Недостатъкът на използването на AUTOINCREMENT ключова дума е, че използва допълнителен процесор, памет, дисково пространство и дискови входно/изходни разходи.

Ето пример за създаване на колона с автоматично увеличение с AUTOINCREMENT ключова дума:

CREATE TABLE Dogs( 
    DogId INTEGER PRIMARY KEY AUTOINCREMENT, 
    DogName
);

Сега поставете данни и ги изберете:

INSERT INTO Dogs VALUES 
    ( NULL, 'Yelp' ),
    ( NULL, 'Woofer' ),
    ( NULL, 'Fluff' );

SELECT * FROM Dogs;

Резултат:

DogId       DogName   
----------  ----------
1           Yelp      
2           Woofer    
3           Fluff     

Ако трябваше да изтрия Fluff от тази таблица, след което вмъкнете нов ред (използвайки NULL като DogId), новият DogId ще бъде 4. С други думи, няма да използва повторно 3.

Ако колоната е била създадена без AUTOINCREMENT ключова дума, тогава следващият ред ще използва повторно DogId от 3.

Ако трябваше да вмъкна DogId от 9223372036854775807 (най-голямото възможно цяло число), ще получа следната грешка при следващото вмъкване, което посочва NULL за тази колона:

Error: database or disk is full

Въпреки това, бих могъл изрично да вмъкна стойност, която е по-ниска от 9223372036854775807, стига тази стойност вече да не се използва от друг ред, и INSERT операцията трябва да успее без горната грешка.

По принцип, след като достигнете 9223372036854775807, автоматичното увеличение вече няма да работи.

Колони, дефинирани без AUTOINCREMENT ключова дума нямат този проблем. Те автоматично ще се върнат и ще се опитат да намерят неизползвано цяло число, което да използват вместо това. Ако обаче са използвани всички цели числа (т.е. таблицата всъщност съдържа 9223372036854775807 реда), тогава дори тези колони ще доведат до горната грешка.


  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 Lower().

  2. Как да използвате командата SQLite Dump

  3. Защо получавам java.lang.IllegalArgumentException:стойността на свързване при индекс 1 е нула в този случай?

  4. Android - Показване на потребителско име от базата данни sqlite след влизане в textView

  5. Android – Трябва ли да проверя дали таблицата съществува в SqliteHelper.onCreate()?