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

使用SQLite3创建带主键的表时插入数据报错,提示列数不匹配

解决SQLite插入操作的列数不匹配错误

问题重现

尝试使用Python的sqlite3库创建带主键的数据库表,执行插入时触发错误。代码如下:

import sqlite3

def connect():
    conn=sqlite3.connect("books.db")
    cur=conn.cursor()
    cur.execute("CREATE TABLE IF NOT EXISTS book (id INTEGER PRIMARY KEY, title text, author text, year integer, isbn integer)")
    conn.commit()
    conn.close()
    
def insert(title,author,year,isbn):
    conn=sqlite3.connect("books.db")
    cur=conn.cursor()
    cur.execute("INSERT INTO book VALUES (NULL,?,?,?,?)",(title,author,year,isbn))
    conn.commit()
    conn.close()
    view()

def view():
    conn=sqlite3.connect('books.db')
    cur=conn.cursor()
    cur.execute("SELECT * FROM book")
    rows=cur.fetchall()
    conn.close()
    return rows

connect()

insert('anybook','anyperson',1918,6384515345)
print(view())

预期输出:

[(1,'anybook','anyperson',1918,6384515345)]

实际报错:

Traceback (most recent call last):
  File "e:\CORSES\The Python Mega Course\000. Projects\APPs\4. BookStore\Book Store\BackEnd.py", line 28, in <module>
    insert('anybook','anyperson',1918,6384515345)
  File "e:\CORSES\The Python Mega Course\000. Projects\APPs\4. BookStore\Book Store\BackEnd.py", line 13, in insert
    cur.execute("INSERT INTO book VALUES (NULL,?,?,?,?)",(title,author,year,isbn))
sqlite3.OperationalError: table book has 4 columns but 5 values were supplied

错误原因

报错提示表只有4列,但插入了5个值,核心原因是:

  • 你之前运行过代码,当时可能创建了不含id列的book表(比如曾经写错了CREATE TABLE语句)
  • 后续代码里的CREATE TABLE IF NOT EXISTS只会在表不存在时创建新表,不会修改已存在的表结构,导致当前表还是只有4列,和插入语句的5个值不匹配。

解决方法

方法1:删除旧数据库文件(最简单)

找到当前目录下的books.db文件并删除,重新运行代码。此时CREATE TABLE IF NOT EXISTS会创建包含id列的5列表,插入语句的5个值(NULL+4个参数)就能匹配列数,且id作为主键会自动自增(传入NULL时SQLite会自动生成递增的id值)。

方法2:修改插入语句(无需删除数据库)

如果不想删除现有数据,可以修改insert函数的SQL语句,明确指定要插入的列名,让SQLite自动处理主键id的生成:

def insert(title,author,year,isbn):
    conn=sqlite3.connect("books.db")
    cur=conn.cursor()
    # 明确指定列名,只插入除id外的4个字段
    cur.execute("INSERT INTO book (title, author, year, isbn) VALUES (?,?,?,?)",(title,author,year,isbn))
    conn.commit()
    conn.close()
    view()

这种方式下,即使表已经有id主键列,SQLite会自动为其分配自增的整数值,无需手动传入NULL。

验证

修改后重新运行代码,就能得到预期的输出:

[(1, 'anybook', 'anyperson', 1918, 6384515345)]

内容的提问来源于stack exchange,提问作者Wael El-Dikhairy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:15:30