Python SQLite3 AUTOINCREMENT Ошибка - PullRequest
       9

Python SQLite3 AUTOINCREMENT Ошибка

0 голосов
/ 25 августа 2018

Я делаю программу списка покупок для моей мамы с 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_products AUTOINCREMENT постоянно возвращает эту ошибку:

sqlite3.OperationalError: near "AUTOINCREMENT": syntax error

1 Ответ

0 голосов
/ 25 августа 2018

Несколько баллов:

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

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

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

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

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

    Пока вы не беспокоитесь о повторном использовании 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 в качестве основного ключа.В любом случае имя элемента будет странным первичным ключом.

...