我正在使用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
答案 0 :(得分:2)
几点:
确定要使用AUTOINCREMENT
吗?是not normally required in SQLite:
AUTOINCREMENT关键字强加了额外的CPU,内存,磁盘空间和磁盘I / O开销,如果没有严格要求,则应避免使用。通常不需要。
在SQLite中,类型为INTEGER PRIMARY KEY的列是ROWID的别名(在WITHOUT ROWID表中除外),该别名始终是64位有符号整数。
在INSERT上,如果未明确为ROWID或INTEGER PRIMARY KEY列提供值,则它将自动用未使用的整数填充,该整数通常比当前使用的最大ROWID多一。无论是否使用AUTOINCREMENT关键字,都是如此。
如果在INTEGER PRIMARY KEY之后出现AUTOINCREMENT关键字,则会更改自动ROWID分配算法,以防止在数据库的生存期内重用ROWID。换句话说,AUTOINCREMENT的目的是防止重复使用先前删除的行中的ROWID。
只要您不担心重复使用先前删除的行INTEGER PRIMARY KEY
中的ROWID,就可以了。
如果您确实想将AUTOINCREMENT
与SQLite一起使用,则它必须位于INTEGER PRIMARY KEY
列中,例如
item_id INTEGER PRIMARY KEY AUTOINCREMENT
您的shopping_products
表在TEXT PRIMARY KEY
上有一个item_name
。
您不能有两个主键,因此,如果您希望item_id
具有AUTOINCREMENT
,则需要停止使用item_name
作为主键。无论如何,项目名称将是一个奇怪的主键。