Резюме :в този урок ще научите за SQLite AUTOINCREMENT
атрибут колона и кога да го използвате във вашата таблица.
Въведение в SQLite ROWID
маса
Всеки път, когато създавате таблица, без да посочите WITHOUT ROWID
опция, получавате имплицитна колона за автоматично увеличение, наречена rowid
. rowid
колона съхранява 64-битово цяло число със знак, което уникално идентифицира ред в таблицата.
Нека видим следния пример.
Първо създайте нова таблица с име people
който има две колони:first_name,
и last_name
:
CREATE TABLE people (
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Второ, вмъкнете ред в people
таблица с помощта на следния INSERT
изявление:
INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Трето, потърсете данни от people
таблица с помощта на следния SELECT
изявление:
SELECT
rowid,
first_name,
last_name
FROM
people;
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Както можете да видите ясно от изхода, SQLite имплицитно създава колона с име rowid
и автоматично присвоява целочислена стойност всеки път, когато вмъкнете нов ред в таблицата.
Имайте предвид, че можете също да се обърнете към rowid
колона, използвайки нейните псевдоними:_rowid_
и oid
.
Когато създавате таблица, която има INTEGER PRIMARY KEY
колона, тази колона е псевдонимът на rowid
колона.
Следното изявление пуска таблица people
и го пресъздава. Този път обаче добавяме друга колона с име person_id
чийто тип данни е INTEGER
и ограничението на колоната е 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)
Опитайте го
В този случай person_id
колоната всъщност е rowid
колона.
Как SQLite присвоява целочислена стойност на rowid
колона?
Ако не посочите rowid
стойност или използвате NULL
стойност, когато вмъкнете нов ред, SQLite автоматично присвоява следващото последователно цяло число, което е едно по-голямо от най-големия rowid
на масата. rowid
стойността започва от 1.
Максималната стойност на rowid
колоната е 9,223,372,036,854,775,807
, което е много голямо. Ако вашите данни достигнат тази максимална стойност и се опитате да вмъкнете нов ред, SQLite ще намери неизползвано цяло число и ще го използва. Ако SQLite не може да намери неизползвано цяло число, той ще издаде SQLITE_FULL
грешка. Освен това, ако изтриете някои редове и вмъкнете нов ред, SQLite ще се опита да използва повторно rowid
стойности от изтритите редове.
Нека направим тест върху него.
Първо вмъкнете ред с максимална стойност в people
таблица.
INSERT INTO people (person_id,first_name,last_name)
VALUES( 9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Второ, поставете друг ред, без да посочвате стойност за person_id
колона:
INSERT INTO people (first_name,last_name)
VALUES('William','Gate');
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Както е ясно показано в изхода, новият ред получи неизползвано цяло число.
Помислете за друг пример.
Първо създайте нова таблица с име t1
която има една колона:
CREATE TABLE t1(c text);
Code language: SQL (Structured Query Language) (sql)
Второ, вмъкнете няколко реда в t1
таблица:
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)
Трето, заявете данни от t1
таблица:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Четвърто, изтрийте всички редове на t1
таблица:
DELETE FROM t1;
Code language: SQL (Structured Query Language) (sql)
Пето, вмъкнете няколко реда в t1
таблица:
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)
И накрая, потърсете данни от t1
таблица:
SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)
Както можете да видите, редовете 1, 2 и 3 са били използвани повторно за новите редове.
SQLite AUTOINCREMENT
атрибут на колона
SQLite препоръчва да не използвате AUTOINCREMENT
атрибут, защото:
AUTOINCREMENT
ключовата дума налага допълнително CPU, памет, дисково пространство и дискови входно/изходни разходи и трябва да се избягва, ако не е строго необходима. Обикновено не е необходимо.
В допълнение, начинът, по който SQLite присвоява стойност за AUTOINCREMENT
колона малко по-различна от начина, по който се прави за rowid
колона.
Помислете за следния пример.
Първо пуснете и създайте отново people
маса. Този път използваме AUTOINCREMENT
колона с атрибути:
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)
Опитайте го
Второ, вмъкнете ред с максималния rowid
стойност в people
таблица.
INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Трето, вмъкнете още един ред в people
таблица.
INSERT INTO people (first_name,last_name)
VALUES('John','Smith');
Code language: SQL (Structured Query Language) (sql)
Опитайте го
Този път SQLite издаде съобщение за грешка, тъй като person_id
колоната не използва повторно числото като rowid
колона.
[Err] 13 - database or disk is full
Code language: SQL (Structured Query Language) (sql)
Кога трябва да използвате AUTOINCREMENT
атрибут на колона?
Основната цел на използването на атрибут AUTOINCREMENT
е да попречи на SQLite да използва повторно стойност, която не е била използвана, или стойност от по-рано изтрития ред.
Ако нямате такова изискване, не трябва да използвате AUTOINCREMENT
атрибут в първичния ключ.
В този урок научихте как SQLite AUTOINCREMENT
атрибутът работи и как влияе върху начина, по който SQLite присвоява стойности на колоната с първичен ключ.