Есть ли автоматическое увеличение в sqlite? - PullRequest
87 голосов
/ 26 октября 2011

Я пытаюсь создать таблицу с автоинкрементом 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 ]

140 голосов
/ 26 октября 2011

Вы получаете один бесплатно, называется 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");

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

43 голосов
/ 26 октября 2011

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

Столбец, объявленный INTEGER PRIMARY KEY, будет автоматически инкрементироваться.

13 голосов
/ 08 июня 2018

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


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

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

  2. В SQLite столбец с типом INTEGER PRIMARY KEY является псевдонимом для ROWID (за исключением таблиц БЕЗ ROWID), которые всегда представляют собой 64-разрядное целое число со знаком.

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

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

9 голосов
/ 26 октября 2011

Вы читали это? Как создать поле AUTOINCREMENT.

INSERT INTO people
VALUES (NULL, "John", "Smith");
3 голосов
/ 08 августа 2017

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

$ 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
2 голосов
/ 22 мая 2017

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

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

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

CREATE TABLE table_name (column1 INTEGER AUTOINCREMENT, тип данных column2, тип column3, тип данных columnN,);

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

sqlite> CREATE TABLE TB_COMPANY_INFO (ID INTEGER PRIMARY KEY AUTOINCREMENT, ИМЯ ТЕКСТ НЕ НУЛЬ, ВОЗРАСТ INT НЕ НУЛ, АДРЕС ЧАР (50)), SALARY REAL);

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

INSERT INTO TB_COMPANY_INFO (ИМЯ, ВОЗРАСТ, АДРЕС, SALARY) ЗНАЧЕНИЯ («MANOJ KUMAR», 40, «Меерут», UP, INDIA ', 200000.00);

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

2 голосов
/ 06 апреля 2015

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

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

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

1 голос
/ 24 ноября 2017

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

Теперь, оглядываясь на ваш запрос, он должен выглядеть примерно так.

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

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

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...