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

SQLite中AUTO_INCREMENT id字段失效问题求助(CS50x作业)

解决SQLite自增ID为NULL的问题

嘿,我看你在CS50x第七次作业里碰到了SQLite自增主键的小坑——明明设置了AUTO_INCREMENT,插入数据后id字段却全是NULL,这其实是SQLite和MySQL这类数据库的语法差异导致的。

问题根源

SQLite并不支持你写的INTEGER AUTO_INCREMENT PRIMARY KEY这种语法,它的自增主键规则和MySQL不一样:

  • 在MySQL里,AUTO_INCREMENT是字段的独立属性,放在类型后面即可生效;
  • 但在SQLite里,AUTOINCREMENT(注意是单单词,无下划线)是PRIMARY KEY的修饰符,必须紧跟在PRIMARY KEY后面才能被识别。你之前的写法顺序错误,SQLite无法解析这个自增规则,所以插入数据时,因为你没有指定id的值,字段就默认填充了NULL。

修复方案

你有两种正确的写法可以实现从1开始自动递增的id:

写法1:显式使用AUTOINCREMENT

这种写法最明确,适合需要严格控制ROWID不被复用的场景:

CREATE TABLE students (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    first_name VARCHAR(255) NOT NULL,
    middle_name VARCHAR(255) DEFAULT NULL,
    last_name VARCHAR(255) NOT NULL,
    house VARCHAR(10),
    birth INTEGER
);

写法2:简化版(推荐)

SQLite里只要把字段设为INTEGER PRIMARY KEY,它就会自动成为ROWID的别名,默认从1开始自增,日常使用和上面的写法效果几乎一致,还更简洁:

CREATE TABLE students (
    id INTEGER PRIMARY KEY,
    first_name VARCHAR(255) NOT NULL,
    middle_name VARCHAR(255), -- 不写DEFAULT NULL也默认允许为NULL
    last_name VARCHAR(255) NOT NULL,
    house VARCHAR(10),
    birth INTEGER
);

后续操作

如果你已经创建了原来的错误表,记得先执行DROP TABLE students;删除它,再用上面的正确语句重新建表,之后插入测试数据,id就会自动从1开始递增啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:18:47