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

АВТОМАТИЧНО НАРАЩАНЕ на SQLite

Резюме :в този урок ще научите за 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 fullCode language: SQL (Structured Query Language) (sql)

Кога трябва да използвате AUTOINCREMENT атрибут на колона?

Основната цел на използването на атрибут AUTOINCREMENT е да попречи на SQLite да използва повторно стойност, която не е била използвана, или стойност от по-рано изтрития ред.

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

В този урок научихте как SQLite AUTOINCREMENT атрибутът работи и как влияе върху начина, по който SQLite присвоява стойности на колоната с първичен ключ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Да се ​​изтрият ли няколко реда с помощта на идентификатори?

  2. Sqlite не вмъква данни във 2-ра таблица

  3. Персонализиран календар и напомняне за Android

  4. SELECT DISTINCT Не работи Android SQLite

  5. Най-добрите начини за създаване на резервни копия за офлайн приложение?