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

68

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

Теги:
cygwin

7 ответов

95
Лучший ответ

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

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

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

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

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

и используйте

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

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

  • 41
    ROWID - это не то же самое, что истинный автоинкремент, поскольку значение SAME может генерироваться более одного раза. Например, с пустой таблицей вставка 3 строк дает 3-й строке ROWID 3, как и ожидалось. Однако вставьте 2 строки, удалите последнюю и вставьте другую, и у 3-й вставленной строки будет ROWID 2, как и у 2-й строки. Следовательно, существует очевидная серьезная проблема, если таблицы ссылаются на идентификаторы ROWID в таблице, в которой происходит удаление и где удаление или обнуление ROWID также не выполняются в связанных таблицах.
  • 6
    Если это не очевидно из ответа, вы можете использовать ROWID в вашем операторе select rowid from people; например, select rowid from people;
22

Да, это возможно. Согласно документам SQLite, "Столбец, объявленный INTEGER PRIMARY KEY, будет автоинкремент". (http://www.sqlite.org/autoinc.html)

  • 8
    Предостережение, как упомянуто Уку и также объяснено в документации, заключается в том, что вам нужно передать NULL для ID, чтобы это работало.
  • 15
    Вам нужно использовать только NULL, если вы пропустите INSERT из списка столбцов - это никогда не будет хорошей практикой. Если вы укажете столбцы, вы можете просто пропустить столбец автоинкремента, и он получит следующее значение.
8

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

INSERT INTO people
VALUES (NULL, "John", "Smith");
  • 0
    Итак, вы говорите, что то, что я пытаюсь сделать, невозможно, но я могу имитировать. Мне нужно использовать нуль во вставке?
  • 1
    вам не нужно ничего делать, но всегда вставлять NULL в качестве идентификатора, это просто объясняет, как sqlite делает это внутренне.
Показать ещё 1 комментарий
2

Нельзя указывать ключевое слово 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

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

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

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

CREATE TABLE имя_таблицы (  column1 INTEGER AUTOINCREMENT,  column2 тип данных,  column3,  .....  columnN тип данных, );

Пример см. ниже: Рассмотрим таблицу КОМПАНИИ, которая будет создана следующим образом:

sqlite > CREATE TABLE TB_COMPANY_INFO (  ID INTEGER PRIMARY KEY AUTOINCREMENT,  NAME TEXT NOT NULL,  AGE INT NOT NULL,  АДРЕС CHAR (50),  SALARY REAL );

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

INSERT INTO TB_COMPANY_INFO (ИМЯ, ВОЗРАСТ, АДРЕС, ОТОБРАЖЕНИЕ) ЦЕННОСТИ ('MANOJ KUMAR', 40, 'Meerut, UP, INDIA', 200000.00);

Теперь выберите запись SELECT * FROM TB_COMPANY_INFO ИДЕНТИФИКАТОР НАЗВАНИЯ АДРЕС АДРЕС 1 Маной Кумар 40 Меерут, ВВЕРХ, ИНДИЯ 200000.00

1

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

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

Подробнее читайте здесь.

  • 0
    очевидно, rowid не всегда автоматически увеличивается, см. комментарий Ника
  • 0
    Не правда. Автоинкремент лучше в некоторых отношениях, так как он не будет повторно использовать идентификаторы - довольно важное требование для многих систем.
0

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

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

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

Это работает на моем конце. Таким образом,

Изображение 1137

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню