Есть ли автоматическое приращение в sqlite?

Я пытаюсь создать таблицу с автоинкрементным primary key на и sqlite3. Я не уверен, что это действительно возможно, но я надеюсь только обозначить другие поля.

например:

CREATE TABLE people (id integer primary key auto increment, first_name varchar(20), last_name varchar(20));

затем, когда я добавляю значение, я надеялся только сделать:

INSERT INTO people
VALUES ("John", "Smith");

это вообще возможно?

Я sqlite3 под cygwin в Windows 7.

8 ответов


вы получаете один бесплатно, называется ROWID. Это в каждой таблице SQLite, просите вы об этом или нет.

Если вы включаете столбец типа INTEGER PRIMARY KEY, этот столбец указывает на (является псевдонимом) автоматический столбец ROWID.

ROWID (каким бы именем вы его ни называли) присваивается значение всякий раз, когда вы вставляете строку, как и следовало ожидать. Если явно назначить ненулевое значение на INSERT, он получит указанное значение вместо автоматического приращения. Если вы явно назначьте значение NULL на INSERT, он получит следующее значение автоматического приращения.

кроме того, вы должны стараться избегать:

 INSERT INTO people VALUES ("John", "Smith");

и использовать

 INSERT INTO people (first_name, last_name) VALUES ("John", "Smith");

вместо. Первая версия очень хрупкая - если вы когда-либо добавляете, перемещаете или удаляете столбцы в определении таблицы, вставка либо завершится ошибкой, либо приведет к неправильным данным (со значениями в неправильных столбцах).


Да, это возможно. Согласно SQLite FAQ:

столбец объявлен INTEGER PRIMARY KEY будет автоувеличение.


вы это читали? Как создать поле автоинкремента.

INSERT INTO people
VALUES (NULL, "John", "Smith");

на сегодняшний день - июнь 2018


вот что официальная документация SQLite должен сказать по этому вопросу (жирный и курсив мой):

  1. на автоинкремент ключевое слово накладывает дополнительный процессор, память, дисковое пространство и дисковый ввод-вывод и следует избегать, если это не требуется строго. Это обычно не требуется.

  2. в SQLite, столбец с типом целое число Первичный ключ-это псевдоним для идентификатор rowid (за исключением без таблиц ROWID), который всегда имеет 64-разрядную подпись целое число.

  3. на вставке,если столбец первичного ключа ROWID или INTEGER не явно заданное значение, затем оно будет автоматически заполнено неиспользуемое целое число, обычно один больше, чем самый большой ROWID в настоящее время в использовать. это верно независимо от того, является ли AUTOINCREMENT используется ключевое слово.

  4. Если автоинкремент ключевое слово после целочисленного первичного ключа, что изменяет алгоритм автоматического назначения ROWID на предотвратить повторное использование ROWIDs за время существования базы данных. другими словами, цель AUTOINCREMENT предотвратить повторное использование ROWIDs от ранее удаленные строки.


SQLite AUTOINCREMENT-ключевое слово, используемое для автоматического увеличения значения поля в таблице. Мы можем автоматически увеличивать значение поля, используя ключевое слово AUTOINCREMENT при создании таблицы с определенным именем столбца для его автоматического увеличения.

ключевое слово AUTOINCREMENT можно использовать только с целочисленным полем. Синтаксис:

основное использование ключевого слова AUTOINCREMENT выглядит следующим образом:

создать таблицу table_name( столбец1 целое АВТОУВЕЛИЧЕНИЕ, столбец2 тип данных, тип столбец3 , ..... тип columnN , );

Например, См. Ниже: Рассмотрим таблицу компании, которая будет создана следующим образом:

sqlite> создать таблицу TB_COMPANY_INFO( ID ЦЕЛОЧИСЛЕННЫЙ ПЕРВИЧНЫЙ КЛЮЧ AUTOINCREMENT, ТЕКСТ ИМЕНИ НЕ NULL, ВОЗРАСТ INT НЕ NULL, АДРЕС ЧАРЕ(50), ЗАРПЛАТА РЕАЛЬНАЯ );

теперь вставьте следующие записи в таблицу TB_COMPANY_INFO:

ВСТАВИТЬ В TB_COMPANY_INFO (ИМЯ, ВОЗРАСТ, АДРЕС, ЗАРПЛАТА) Значения ('MANOJ KUMAR', 40, 'Meerut, UP, INDIA', 200000.00);

Теперь выберите запись ВЫБЕРИТЕ *ИЗ TB_COMPANY_INFO ID ИМЯ ВОЗРАСТ АДРЕС ЗАРПЛАТА 1 Manoj Kumar 40 Meerut, UP, Индия 200000.00


не нужно указывать AUTOINCREMENT ключевое слово возле PRIMARY KEY. Пример создания первичного ключа autoincrement и вставки:

$ sqlite3 ex1

CREATE TABLE IF NOT EXISTS room(room_id INTEGER PRIMARY KEY, name VARCHAR(25) NOT NULL, home_id VARCHAR(25) NOT NULL);

INSERT INTO room(name, home_id) VALUES ('test', 'home id test');

INSERT INTO room(name, home_id) VALUES ('test 2', 'home id test 2');

SELECT * FROM room;

даст:

1|test|home id test
2|test 2|home id test 2

рядом с rowid вы можете определить свое собственное поле автоматического приращения, но это не рекомендуется. Это всегда лучшее решение, когда мы используем rowid, который автоматически увеличивается.

на AUTOINCREMENT ключевое слово накладывает дополнительный процессор, память, дисковое пространство и дисковый ввод-вывод накладных расходов и следует избегать, если это не требуется строго. Это обычно не требуется.

читать здесь для получения подробной информации.


Я знаю, что этот ответ немного поздно.
моя цель для этого ответа - для всех ссылок, если они столкнутся с этим типом проблемы с SQLite сейчас или в будущем, и им будет трудно с ним.

сейчас, оглядываясь на свой запрос, это должно быть что-то вроде этого.

CREATE TABLE people (id integer primary key autoincrement, first_name varchar(20), last_name varchar(20));

Он работает на моем конце. Вот так,

enter image description here

на всякий случай, если вы работаете с SQLite, я предлагаю вам проверить браузер БД для SQLite. Работает на разных платформах.