Ошибка AUTOINCREMENT Python SQLite3

Я делаю программу списка покупок для моей мамы с Python, SQLite3 и Bottle, Я делаю таблицу для размещения всех своих предметов, но item_id с AUTOINCREMENT в столбце не работает:

c.execute("""CREATE TABLE categories (
            category_id INTEGER NOT NULL,
            category_name TEXT PRIMARY KEY NOT NULL)""")

c.execute("""CREATE TABLE products (
            item_name TEXT PRIMARY KEY NOT NULL,
            item_category_id INTEGER NOT NULL)""")

c.execute("""CREATE TABLE shopping_products (
            item_id INTEGER AUTOINCREMENT,
            item_name TEXT PRIMARY KEY NOT NULL,
            item_category_id INTEGER NOT NULL, 
            item_quantity INTEGER NOT NULL,
            item_date INTEGER NOT NULL)""")

В таблице shopping_productsAUTOINCREMENT продолжает возвращать эту ошибку:

sqlite3.OperationalError: near "AUTOINCREMENT": syntax error
stackoverflow.com/questions/7905859/…
warvariuc 25.08.2018 21:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
863
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Несколько моментов:

  1. Вы уверены, что вам нужен AUTOINCREMENT? Это обычно не требуется в SQLite:

    1. The AUTOINCREMENT keyword imposes extra CPU, memory, disk space, and disk I/O overhead and should be avoided if not strictly needed. It is usually not needed.

    2. In SQLite, a column with type INTEGER PRIMARY KEY is an alias for the ROWID (except in WITHOUT ROWID tables) which is always a 64-bit signed integer.

    3. On an INSERT, if the ROWID or INTEGER PRIMARY KEY column is not explicitly given a value, then it will be filled automatically with an unused integer, usually one more than the largest ROWID currently in use. This is true regardless of whether or not the AUTOINCREMENT keyword is used.

    4. If the AUTOINCREMENT keyword appears after INTEGER PRIMARY KEY, that changes the automatic ROWID assignment algorithm to prevent the reuse of ROWIDs over the lifetime of the database. In other words, the purpose of AUTOINCREMENT is to prevent the reuse of ROWIDs from previously deleted rows.

    Если вы не беспокоитесь о повторном использовании ROWID из ранее удаленных строк, INTEGER PRIMARY KEY подойдет.

  2. Если вы действительно хотите использовать AUTOINCREMENT с SQLite, он должен быть в столбце INTEGER PRIMARY KEY, например.

    item_id INTEGER PRIMARY KEY AUTOINCREMENT
    
  3. В вашем столе shopping_products есть TEXT PRIMARY KEY на item_name.

    У вас не может быть двух первичных ключей, поэтому, если вы хотите, чтобы у item_id был AUTOINCREMENT, вам нужно прекратить использовать item_name в качестве первичного ключа. В любом случае имя элемента будет странным первичным ключом.

Для этого конкретного случая, я думаю, это из того же документа лучше ответит: Because AUTOINCREMENT keyword changes the behavior of the ROWID selection algorithm, AUTOINCREMENT is not allowed on WITHOUT ROWID tables or on any table column other than INTEGER PRIMARY KEY. Any attempt to use AUTOINCREMENT on a WITHOUT ROWID table or on a column other than the INTEGER PRIMARY KEY column results in an error.

Surgeon 07.01.2019 20:23

Другие вопросы по теме