Python SQLite3 AUTOINCREMENT错误

时间:2018-08-25 19:10:20

标签: python sqlite auto-increment bottle

我正在使用Python,SQLite3和Bottle为我的妈妈制作一个购物清单程序, 我正在制作一张桌子,将我所有的物品都放进去,但该列上的item_idAUTOINCREMENT却不起作用:

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 :(得分:2)

几点:

  1. 确定要使用AUTOINCREMENT吗?是not normally required in SQLite

      
        
    1. AUTOINCREMENT关键字强加了额外的CPU,内存,磁盘空间和磁盘I / O开销,如果没有严格要求,则应避免使用。通常不需要。

    2.   
    3. 在SQLite中,类型为INTEGER PRIMARY KEY的列是ROWID的别名(在WITHOUT ROWID表中除外),该别名始终是64位有符号整数。

    4.   
    5. 在INSERT上,如果未明确为ROWID或INTEGER PRIMARY KEY列提供值,则它将自动用未使用的整数填充,该整数通常比当前使用的最大ROWID多一。无论是否使用AUTOINCREMENT关键字,都是如此。

    6.   
    7. 如果在INTEGER PRIMARY KEY之后出现AUTOINCREMENT关键字,则会更改自动ROWID分配算法,以防止在数据库的生存期内重用ROWID。换句话说,AUTOINCREMENT的目的是防止重复使用先前删除的行中的ROWID。

    8.   

    只要您不担心重复使用先前删除的行INTEGER PRIMARY KEY中的ROWID,就可以了。

  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作为主键。无论如何,项目名称将是一个奇怪的主键。