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

SQLite3中CustomerID自增返回Null,如何修复?

修复SQLite中CustomerID字段自动递增失效的问题

问题原因

SQLite对自增主键有严格的类型要求:只有当主键字段的类型为INTEGER(而非INT),并且声明为PRIMARY KEY AUTOINCREMENT(或更常用的INTEGER PRIMARY KEY)时,才会自动生成递增的整数值。你当前使用INT类型定义CustomerID,导致自增逻辑不生效,插入数据时该字段返回NULL。

修复方案

方案1:重新创建表(无已有数据或可清空数据)

修改表定义,将CustomerID的类型改为INTEGER,并正确声明自增主键:

tblcustomer = """ CREATE TABLE IF NOT EXISTS Customer
        (
         CustomerID INTEGER PRIMARY KEY AUTOINCREMENT,
         CustomerName TEXT,
         Address TEXT,
         Postcode TEXT,
         EmailAddress TEXT
        )"""

cursor.execute(tblcustomer)
connection.commit()

注:如果不需要严格保证ID不会复用已删除行的ID,可简化为CustomerID INTEGER PRIMARY KEY,此写法默认会自动递增,性能略优于带AUTOINCREMENT的版本。

方案2:保留已有数据,间接修改表结构

SQLite不允许直接修改字段类型,需通过临时表迁移数据:

-- 1. 创建临时表备份原数据
CREATE TABLE Customer_temp AS SELECT * FROM Customer;

-- 2. 删除原表
DROP TABLE Customer;

-- 3. 重新创建正确结构的表
CREATE TABLE Customer
(
 CustomerID INTEGER PRIMARY KEY AUTOINCREMENT,
 CustomerName TEXT,
 Address TEXT,
 Postcode TEXT,
 EmailAddress TEXT
);

-- 4. 将临时表数据导入新表(跳过CustomerID,让自增逻辑生成)
INSERT INTO Customer (CustomerName, Address, Postcode, EmailAddress)
SELECT CustomerName, Address, Postcode, EmailAddress FROM Customer_temp;

-- 5. 删除临时表
DROP TABLE Customer_temp;

执行上述SQL后,原数据会被迁移到新表,新插入的数据会自动生成递增的CustomerID。

正确的插入方式

插入数据时无需指定CustomerID字段,示例代码:

# 插入示例数据
cursor.execute("INSERT INTO Customer (CustomerName, Address, Postcode, EmailAddress) VALUES (?, ?, ?, ?)", 
               ("张三", "北京市朝阳区XX街道", "100020", "zhangsan@example.com"))
connection.commit()

内容的提问来源于stack exchange,提问作者iaivazovski

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:31:13