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 реда), тогава дори тези колони ще доведат до горната грешка.