如何让SQLite主键ID使用自定义值而非自增?解决唯一约束问题
解决方案:SQLite插入自定义ID失败问题
核心问题分析
你的代码存在插入字段与值的数量、顺序不匹配的错误,导致自定义ID未被正确写入ID字段,触发了SQLiteINTEGER PRIMARY KEY的默认自增行为:
- 插入语句仅声明5个字段,但
VALUES写了6个占位符 - 表结构包含
Entry Number字段,但插入时未将其加入字段列表,导致所有值的对应位置整体偏移,自定义ID被错误插入到其他字段,ID字段因未收到有效值而使用自增序列
修复步骤
- 修正插入语句的字段列表,确保包含所有要插入的字段,且数量与
VALUES占位符完全匹配 - 确认
zip拼接的值顺序与字段顺序严格对应
修正后的代码
def sqlInput(groupValues, userLogin): sqliteConnection = None try: sqliteConnection = sqlite3.connect('NEA.db') cursor = sqliteConnection.cursor() print() print("Connected to SQLite server.") print() cursor.execute('''CREATE TABLE IF NOT EXISTS "Food Tracker" ( ID INTEGER PRIMARY KEY, "Entry Number" INTEGER, "Calories" INTEGER, "Food Item" TEXT, "Date" TEXT, "Time" TEXT )''') # 修正:补充"Entry Number"字段,与VALUES的6个占位符匹配 insertQuery ="""INSERT INTO "Food Tracker"( "ID", "Entry Number", "Food Item", "Calories", "Date", "Time") VALUES (?,?,?,?,?,?)""" # 确保zip顺序与字段顺序严格对应 inserting = list( zip(userLogin.primarykey, groupValues.entry, groupValues.food, map(int, groupValues.calories), groupValues.date, groupValues.time)) cursor.executemany(insertQuery,inserting) sqliteConnection.commit() print("Successfully entered data into SQLite database.") print() menu(userLogin) except sqlite3.Error as error: print() print("Failed to insert data into SQLite database:", error) print() finally: if sqliteConnection: sqliteConnection.close()
额外说明
- SQLite中
INTEGER PRIMARY KEY默认是ROWID的别名,会自动自增,但只要显式为其指定有效值,就会优先使用自定义值,不会触发自增逻辑 - 重复插入同一ID时触发
UNIQUE constraint failed是正常行为(主键唯一性约束),若需覆盖已有数据,可将INSERT改为INSERT OR REPLACE
内容的提问来源于stack exchange,提问作者Jush Gorania
相关产品推荐
相关产品推荐

