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

