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
相关产品推荐
相关产品推荐

