You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让SQLite主键ID使用自定义值而非自增?解决唯一约束问题

解决方案:SQLite插入自定义ID失败问题

核心问题分析

你的代码存在插入字段与值的数量、顺序不匹配的错误,导致自定义ID未被正确写入ID字段,触发了SQLiteINTEGER PRIMARY KEY的默认自增行为:

  • 插入语句仅声明5个字段,但VALUES写了6个占位符
  • 表结构包含Entry Number字段,但插入时未将其加入字段列表,导致所有值的对应位置整体偏移,自定义ID被错误插入到其他字段,ID字段因未收到有效值而使用自增序列

修复步骤

  1. 修正插入语句的字段列表,确保包含所有要插入的字段,且数量与VALUES占位符完全匹配
  2. 确认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 23:55:07